Конфликты во время обновления сценариев с Elasticsearch и. NET - PullRequest
3 голосов
/ 28 января 2020

Я собираю некоторую статистику в 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 имеют какую-то встроенную функцию, которая поможет еще дальше, это будет первым приоритетом для реализации.

...