Conversation
| lock (_historyLock) | ||
| { | ||
| return ReplicaAddresses.OrderBy(addr => | ||
| { | ||
| if (_responseHistory.TryGetValue(addr, out var times) && times.Count > 0) | ||
| return times.Average(t => t.TotalMilliseconds); | ||
| return double.MaxValue; | ||
| }); | ||
| } |
There was a problem hiding this comment.
Сам по себе вызов OrderBy ничего не делает. Лишь когда после OrderBy применишь foreach, ToList() или подобное -- лишь тогда действительно произойдёт сортировка, и, соответственно, лишь тогда будет вызван делегат переданный аргументом в OrderBy -- т.е. обращения к словарю будут вне lock'а
| protected override ILog Log => LogManager.GetLogger(typeof(RoundRobinClusterClient)); | ||
| try | ||
| { | ||
| var responseTask = request.GetResponseAsync(); |
There was a problem hiding this comment.
Почему не используешь ProcessRequestAsync(WebRequest)?
| Log.InfoFormat("Replica {0} succeeded", replicaAddress); | ||
|
|
||
| stopwatch.Stop(); | ||
| UpdateStatistics(replicaAddress, stopwatch.Elapsed); |
There was a problem hiding this comment.
Обновляешь статистику только для успешных и вовремя ответивших реплик. Может случиться так, что реплика всё время 500-тит или отвечает дольше чем за perReplicaTimeout, а при этом опрашивается всегда первой
|
|
||
| while (i < orderedReplicas.Length) | ||
| { | ||
| if (!taskToAddress.Values.Contains(orderedReplicas[i])) |
There was a problem hiding this comment.
Разве есть случаи, когда условие может оказаться ложным?
| var totalTimeout = timeout; | ||
| var stopwatch = Stopwatch.StartNew(); | ||
| var taskToAddress = new Dictionary<Task<string>, string>(); | ||
| var i = 0; |
There was a problem hiding this comment.
В чём смысл этой переменной? По использованию не очень понятно, что именно она считает
|
|
||
| private async Task<string> AwaitFirstSuccessAsync(List<(Task<string> Task, string Address)> tasks, TimeSpan timeout, CancellationTokenSource cts) | ||
| { | ||
| var timeoutTask = Task.Delay(timeout, cts.Token); |
There was a problem hiding this comment.
По-хорошему timeoutTask бы создать до цикла c ProcessSingleRequestAsync. Иначе выходит, что запросы уже какое-то время как отправлены
No description provided.