У меня есть служба событий, которая соответствует всем действиям (просмотренным / отправленным) пользователем.Каждое событие будет иметь session_id вместе с другими атрибутами, такими как page_id, url, page_type (просмотр / отправка) и т. Д.
У меня есть следующие проблемы, которые мне нужно решить:
- Поскольку было бы передано много событий, я хочу записать / протолкнуть их куда-нибудь максимально быстрым способом.
- Обработка событий для различных session_ids должна выполняться параллельно.Для событий с одинаковым идентификатором сеанса обработка должна быть синхронной.Например, событие оплаты клиента должно быть до события, отправленного формой
- Обработка события выполняется отдельной службой.Эта служба предоставляет URL-адрес, по которому данные события передаются для обработки.Теперь я не хочу перегружать этот сервис большим количеством запросов, чем он может обработать.Если он может обрабатывать 2k запросов одновременно, я смогу ограничить число моих одновременных вызовов не более чем 2000.
Вот то, что я смог сделать до сих пор.
Для задачи 1:
У меня есть отдельный сервис, который отправляет события, полученные из браузера, в AWS DynamoDB .Затем я могу включить Streams на созданной таблице.А благодаря правильной настройке разделов при создании таблицы я могу убедиться, что журналы событий для одного session_id отсортированы (сохраняя ключ разделения как session_id и ключ сортировки как созданный_ат).
Однако я не знаю, как решить две другие проблемы.Решения, которые я имею в виду, могут решить любое из двух, но не оба.
- Я могу настроить службу пула, которая гарантирует, что общее количество запросов на обработку событий не превышаетопределенное количество.Если входящих запросов больше, то он поставит их в очередь и обработает, как только сервер обработки событий освободится, т. Е. Число одновременных подключений меньше 2000. Но это решение не гарантирует синхронную обработку событий, принадлежащих одному и тому же session_id.,Если у меня лимит пула 2000 соединений, и у меня 20 событий одного и того же сеанса, моя служба пула будет одновременно выполнять 20 запросов к службе обработки событий.
- У меня может быть служба, которая порождает новуюобработка для каждого session_id при обработке события.В этом случае у меня будет процесс для session_id для обработки события.Итак, я гарантирую, что события, принадлежащие одному и тому же session_id, будут отправлены одному процессу.Теперь эти процессы должны быть легковесными, чтобы мой сервис не раздавался при множественном количестве одновременных сеансов.Я могу написать сервис на Go или Erlang здесь.Но это не гарантирует, что служба обработки событий получает не более указанного количества запросов параллельно.
Может кто-нибудь помочь разобраться в решении или указать мне правильное направление?