Skip to content

Шептихин Вячеслав, ДЗ №2#69

Open
sheptikhinv wants to merge 4 commits intokontur-courses:masterfrom
sheptikhinv:master
Open

Шептихин Вячеслав, ДЗ №2#69
sheptikhinv wants to merge 4 commits intokontur-courses:masterfrom
sheptikhinv:master

Conversation

@sheptikhinv
Copy link
Copy Markdown

No description provided.

var delay = Task.Delay(timeoutPerReplica);

var completedTask = await Task.WhenAny(requestTask, delay);
_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.

Некорректное поведение в случае если реплика не ответила и мы вышли по таймауту или если произошла ошибка при отправке запроса или у самой реплики.

В случае с таймаутом, мы запишем некорректное время т.к. мы не знаем реального времени когда завершится запрос. В таком случае лучше либо не записывать такую статистику (она не достоверная), либо записывать время выполнение но умножать его на какой-то штраф (хотя бы x2/x3)

В случае если произошла ошибка, то Task.WhenAny может моментально вернуть нашу таску и мы запишем время выполнения некорректно, что потом повлияет на сортировку и эта реплика станет первой (а не в конце списка). В этом случае надо выставлять достаточно большое штрафное время (выше нормального времени обработки)


var delay = Task.Delay(timeoutPerReplica);
var completedTask = await Task.WhenAny(pendingRequests.Append(delay)) as Task<string>;
_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. Такая же как описывал выше в RoundRobingClusterClient, в случае таймаута мы запишем время некорректное (= timeoutPerReplica), а в случае ошибки, мы запишим некорректно маленькое время, что поднимет реплику в сортировке на самый верх, хотя должна была быть отправлена в самый низ списка реплик
  2. Запись статистики привязана к текущему значению foreach replicaAddress, НО в completedTask может оказаться любой запрос запущенный ранее (т.е. когда foreach уже на последней реплике, в completedTask может оказаться завершенный запрос для первой или второй реплики). Это собственно неправильно запишет статистику и соответственно неправильно отсортирует наши реплики

return await completedTask;
}

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