Conversation
|
|
||
| if (requestTask.Status == TaskStatus.RanToCompletion) | ||
| { | ||
| _replicaStatus[replicaAddress] = replicaTimeout.TotalMilliseconds; |
There was a problem hiding this comment.
Не верно записывается время ответа реплики. В результат записывается время таймаута, а не фактическое время выполнения запроса (его можно было бы измерить через создание Stopwatch внутри цикла.
В итоге даже при успешном выполнении, реплике записывается время его таймаута и при больших таймаутах хорошая реплика будет помечена как медленная
|
|
||
| if (completedTask == timeoutTask) | ||
| { | ||
| _replicaStatus[replicaAddress] = replicaTimeout.TotalMilliseconds; |
There was a problem hiding this comment.
Эта запись статистики становится немного бессмысленной, когда ниже то же время выставляется в статистику. Для исправления ситуации здесь необходимо было бы увеличивать время на какой-то штраф, чтобы гарантировано эту реплику понизить для последующих запросов
|
|
||
| if (finishedItem.Task.Status == TaskStatus.RanToCompletion) | ||
| { | ||
| _replicaStatus[finishedItem.Address] = timer.ElapsedMilliseconds; |
There was a problem hiding this comment.
Тут записывается неверная статистика таймера для реплики. Мы записываем в статистику время прошедшее в целом с начала вызова нашего клиента и туда включено не фактическое время выполнения запроса к конкретной реплики, а все время затраченное на инициализацию, сортировку, цикл, создание запросов ко всем репликам и все ожидания.
В итоге первая реплика получит меньшее время чем к примеру вторая реплика, хотя вторая реплика может отвечать быстрее первой. Необъективная статистика получается
| if (completedTask == timeoutTask) | ||
| continue; |
There was a problem hiding this comment.
При таймауте не обновляется время у реплики, в итоге она будет считаться всегда быстрой. Тут бы записывать в статистику время + какой-то штраф
|
|
||
| if (finishedItem.Task.Status == TaskStatus.RanToCompletion) | ||
| { | ||
| _replicaStatus[finishedItem.Address] = timer.ElapsedMilliseconds; |
There was a problem hiding this comment.
Так как дубль логики, то та же ошибка что и выше, мы записываем необъективную оценку времени выполнения в статистику
| while (pendingTasks.Count != 0) | ||
| { |
There was a problem hiding this comment.
В While дубль логики, что и в For. Дублирвоание логики всегда плохо и в особенности если где-то ошибка, то ее надо не забыть исправлять в нескольких местах.
Для улучшения ситуации, можно было бы это вынести в отдельный метод
No description provided.