Conversation
Ждем ответа хотя бы от одной реплики и сразу же возвращаем ответ
Обработка реплик, с одинаковым таймаутом. Если не успела обработаться, обрабатываем следующую
Ждем ответа от реплик при запросе последующих
| 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; |
There was a problem hiding this comment.
Надо бы дожидаться не просто первой таски, а первой успешной
There was a problem hiding this comment.
Надо бы дожидаться не просто первой таски, а первой успешной
Внес правки в текущую реализацию: c3a8b36
|
|
||
| if (!resultTask.IsCompleted) | ||
| { | ||
| _ = resultTask.ContinueWith(t => _ = t.Exception, TaskContinuationOptions.OnlyOnFaulted); |
There was a problem hiding this comment.
Что делает эта строка?
В этой строке ловится исключение у запроса, который мы перестали ждать из-за того, что перешли к следующей реплике. Я так сделал для избежания вызова исключения UnobservedTaskException
| "Не удалось получить успешный ответ ни от одной реплики")); | ||
| }, TaskContinuationOptions.ExecuteSynchronously); | ||
|
|
||
| var completed = await Task.WhenAny(firstSuccess.Task, Task.Delay(perReplicaTimeout)); |
There was a problem hiding this comment.
Может быть так, что task быстро упал ошибкой, но в этой строчке всё равно ждём perReplicaTimeout, хотя должны в таком случае переходить к следующей реплике (как делали бы в round-robin)
Из-за этого один из тестов падает
There was a problem hiding this comment.
Может быть так, что task быстро упал ошибкой, но в этой строчке всё равно ждём perReplicaTimeout, хотя должны в таком случае переходить к следующей реплике (как делали бы в round-robin) Из-за этого один из тестов падает
Исправил это в коммите: 48129e4
No description provided.