Привет!
Есть сервер, на него поступает много запросов каждую секунду.
Некоторые из этих запросов имеют одинаковый параметр т.е. например userId = 1.
Сейчас я произвожу действие D для каждого запроса по отдельности, когда он получен, а мне хотелось бы, чтобы какой-нибудь worker выполнял лишь одно D для всех запросов с одинаковым userId.
Пример выполнения, который мне нужно реализовать:
сейчас unix time условно 100 и в это время ко мне поступило 10 запросов с userId = 1 и 5 запросов userId = 2.
Запросам просто возвращаю ок, что они получены; и передаю их обработчику, который группирует запросы по userId и производит действие, сначала с данными по userId = 1, потом userId = 2 (порядок не важен).
Получилось всего два D, вместо 15.
Затем worker смотрит запросы с меткой времени 101 и так же группирует их и выполняет ...
И ведь получается, что нужно смотреть пришедшие данные каждую секунду
Тогда с помощью чего это реализовать? Нужно, конечно, чтобы задержка по времени и затраты ресурсов были минимальными.
Если делать с mysql, то это очень затратно по ресурсам.
Возможно ли использовать memcached? Получил запросы -> записал кэш -> прочитал кэш -> очистил. И по кругу.
Но ведь тогда сохранность данных под сомнением да и правильно ли так делать?
Как реализовать конкретно на пхп не подскажу, но логику я бы реализовывал так:
-> Старт сервера
-> заводим "условный список" из {D, %номер_юзера}
->> приходит запрос. Проверяем номер юзера из пришедшего запроса и все %номер_юзера из "условный список". Если нашлось соответствие, то отдаем соответствующему D запрос на растерзание. Если нет - создаем новый D и добавляем его в "условный список".