Skip to content

Якшибаев Данил, ДЗ №2#70

Open
gogy4 wants to merge 2 commits intokontur-courses:masterfrom
gogy4:replica-clients
Open

Якшибаев Данил, ДЗ №2#70
gogy4 wants to merge 2 commits intokontur-courses:masterfrom
gogy4:replica-clients

Conversation

@gogy4
Copy link
Copy Markdown

@gogy4 gogy4 commented Mar 7, 2026

No description provided.

var delay = Task.Delay(timeoutPerReplica);

var completedTask = await Task.WhenAny(requestTask, delay);
_replicaTimings[replicaUri] = stopwatch.ElapsedMilliseconds;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут сразу два типа ошибки:

  1. Фиксируется не время затраченное на текущий запрос, а общее прошедшее время. Т.е. даже для самой быстрой реплики, запрос к которой выполнялся (условно 15мс), время будет записано не 15мс, а все время выполнения от начала (т.е. суммирование как минимум всех timeoutPerReplica).
    Поэтому третья реплика будь она самой быстрой "на диком западе" не окажется первой в списке при повторной отправке запрос через этот клиент
  2. Даже если был бы локальный таймер под текущий запрос, при таймауте мы не должны записывать посто время таймаута, а хотя бы штрафное время для понижения реплики в списке. При ошибке так же, время выполнения будет минимальным и реплика незаслужено запишется "как самая быстрая). В случае ошибок должно быть записано высокое штрафное время с гарантированным понижением в списке при сортировке


pendingRequests.Add(ProcessReplicaAsync(replicaAddress, query));
var completedTask = await WaitForReplicaAndLogAsync(pendingRequests, timeoutPerReplica);
_replicaTimings[replicaAddress] = stopwatch.ElapsedMilliseconds;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А здесь уже количество ошибок выросло до трех:

  1. Использование общего таймера, а не индивидуального под каждый запрос — некорректная статистика которая по факту больше вредит, чем помогает
  2. Записывание времени всегда без учета, что произошел таймаут (не знаем реальное время выполнения) и не учитывается ошибка запроса, что может записать некорректное малое значение, что поднимет реплику в списке реплик
  3. Привязка обновления статистики к значению replicaAddress из foreach. У нас в completedTask может вернуться как таймаут, так и Задачи с запросами с предыдущих итераций. В итоге в completedTask может вернуться запрос к replicaAddress1, а у нас в foreach уже replicaAddress3, и мы запишем статистику времени выполнения replicaAddress1 в ячейку для replicaAddress3


Log.Debug("Initial replica attempts finished. Waiting for remaining pending requests");

while (pendingRequests.Count > 0)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А в цикле ожидания завершения задач мы в принципе не запишем никакую статистику. В итоге статистика у нас не имеет ничего общего с реальностью

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants