Skip to content

Глейзер Роман#57

Open
RomanGleyzer wants to merge 6 commits intokontur-courses:masterfrom
RomanGleyzer:master
Open

Глейзер Роман#57
RomanGleyzer wants to merge 6 commits intokontur-courses:masterfrom
RomanGleyzer:master

Conversation

@RomanGleyzer
Copy link

No description provided.

Ждем ответа хотя бы от одной реплики и сразу же возвращаем ответ
Обработка реплик, с одинаковым таймаутом. Если не успела обработаться, обрабатываем следующую
Ждем ответа от реплик при запросе последующих
Comment on lines +26 to +33
var anyReplicaTask = Task.WhenAny(tasks);
var timeoutTask = Task.Delay(timeout);

var completed = await Task.WhenAny(anyReplicaTask, timeoutTask);
if (ReferenceEquals(completed, timeoutTask))
throw new TimeoutException();

return await anyReplicaTask.Result;

Choose a reason for hiding this comment

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

Надо бы дожидаться не просто первой таски, а первой успешной

Copy link
Author

@RomanGleyzer RomanGleyzer Mar 5, 2026

Choose a reason for hiding this comment

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

Надо бы дожидаться не просто первой таски, а первой успешной

Внес правки в текущую реализацию: c3a8b36


if (!resultTask.IsCompleted)
{
_ = resultTask.ContinueWith(t => _ = t.Exception, TaskContinuationOptions.OnlyOnFaulted);

Choose a reason for hiding this comment

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

Что делает эта строка?

Copy link
Author

Choose a reason for hiding this comment

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

Что делает эта строка?

В этой строке ловится исключение у запроса, который мы перестали ждать из-за того, что перешли к следующей реплике. Я так сделал для избежания вызова исключения UnobservedTaskException

"Не удалось получить успешный ответ ни от одной реплики"));
}, TaskContinuationOptions.ExecuteSynchronously);

var completed = await Task.WhenAny(firstSuccess.Task, Task.Delay(perReplicaTimeout));

Choose a reason for hiding this comment

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

Может быть так, что task быстро упал ошибкой, но в этой строчке всё равно ждём perReplicaTimeout, хотя должны в таком случае переходить к следующей реплике (как делали бы в round-robin)
Из-за этого один из тестов падает

Copy link
Author

Choose a reason for hiding this comment

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

Может быть так, что task быстро упал ошибкой, но в этой строчке всё равно ждём perReplicaTimeout, хотя должны в таком случае переходить к следующей реплике (как делали бы в round-robin) Из-за этого один из тестов падает

Исправил это в коммите: 48129e4

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants