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