Лучший способ включить агрегированные подсчеты документов как часть перколяционных запросов

Представьте, что у меня есть поток событий, каждое из которых имеет определенный тип события и относится к определенному пользователю / учетной записи.

Пользователи могут настроить оповещения формы

  • Отправить уведомление, когда событие A произошло 3 раза в течение последнего года / месяца / дня и т. Д.

Я ожидал бы получать сотни таких событий в секунду

Я думал, что у меня будет отдельный индекс для каждого дня

Я также думал о том, нужно ли каким-то образом предварительное агрегирование подсчетов, поскольку выполнение отдельного запроса агрегации / подсчета для каждого входящего события кажется чрезмерным и не масштабируемым, но, возможно, это не проблема?

Каков наилучший подход к этой проблеме?

1 ответ

Один подход, который приходит мне в голову:

  • Наличие индивидуального запроса для каждого пользователя с его настройками. Позволяет им добавлять события со словом "ошибка" к уровню ошибки, например.
  • Каждое событие индексируется в одном индексе для каждого клиента, и, может быть, если у вас много событий для каждого клиента, полезно иметь индекс для каждого клиента, например events_clientId_alarm.

Тогда отображение события должно быть примерно таким:

{
  "indexed_at": datetime,
  "level": keyword [fatal/error/debug/...],
  "log": string
}

Тогда у вас будет поток событий, приходящих на фильтрацию, после того как событие будет перколировано, вы будете знать, где хранить событие.

Затем вы можете использовать кибану / графану и т. Д. Для мониторинга ваших данных индексов и создания аварийных сигналов, если в течение последних 5 минут было 4 события с аварийными сигналами уровня.

В худшем случае у вас будет один индекс с более или менее 8640000 * 365 документами (если у вас только один пользователь со 100/ событиями в секунду), это огромный индекс, но он может корректно управляться ElasticSearch (добавляя достаточно осколков к производить поиск / агрегацию по уровням журналов и датам).

Здесь важно знать, как ваши данные будут увеличиваться со временем, потому что Elasticsearch не позволяет вам добавлять больше сегментов в каждый индекс. Тогда вам нужно задаться вопросом, как данные каждого клиента будут увеличиваться со временем, и угадать, сколько шардов вам понадобится, чтобы все это работало нормально.

ПРИМЕЧАНИЕ: в зависимости от ваших сделок с вашими клиентами, если они хотят всю историю своих событий-данных или что-то в этом роде. Вы можете хранить один индекс в год для каждого клиента, чтобы позволить вам удалять старые данные, если это необходимо и разрешено.

Надеюсь, это поможет, я сделал похожий проект, и я сделал аналогичный подход для достижения этой цели.

Другие вопросы по тегам