Я собираю некоторую статистику в Elasticsearch для количества запросов в час к API. Вместо того, чтобы индексировать новый документ по запросу, я обновляю документ statisti c для пользователя. По каждому запросу я делаю что-то вроде этого. NET:
client
.Update<StatisticsDocument>(statsId, u => u
.RetryOnConflict(3)
.Script(s => s.Source("ctx._source.requests+=1"))
.Upsert(new StatisticsDocument { Id = statsId, Requests = 1, User = userId, Created = thisHour }));
Итак, requests
увеличивается. Если документ для этой ошибки и пользователь с userId
не существует, я создаю новый, используя Upsert
-метод.
Может быть больше потоков и процессов, вызывающих этот код, почему я добавил RetryOnConflict(3)
, чтобы повторить попытку конфликта.
В любом случае я вижу довольно большое количество конфликтов, особенно при высокой нагрузке. Я понимаю, что повторная попытка 3 раза не всегда решает эту проблему, так как есть много потоков, пытающихся обновить один и тот же документ снова и снова. Но я все еще удивлен довольно большим количеством конфликтов.
Есть идеи о том, что здесь делать? Я думаю о том, чтобы сохранить metri c в памяти и затем писать его каждую минуту или что-то в этом роде. Но если Elasticsearch и / или Nest имеют какую-то встроенную функцию, которая поможет еще дальше, это будет первым приоритетом для реализации.