сервера запрос попадает в очередь, которая запускает обработчик, генерирует ответ, и отправляет пользователю. У пользователя хранится "прогресс", на каком этапе бота он находится.
Проблема в том, что если отправить два сообщения подряд, то может произойти ситуация, когда в очередь встанут две команды, и будут выполнены одновременно.
Первый обработчик получил команду "123", начал обрабатывать её, ещё не дошёл до перезаписи "прогресса", как в то же время второй обработчик начал обрабатывать команду "234". В итоге оба обработали одну и ту же задачу, и задвоили ответ.
Что делать в таком случае?
Думал в самом начале обработки ставить отдельный флаг, что уже есть задача в очереди, и при повторном сообщении откладывать выполнение на несколько секунд, но это костыль какой-то..
а какой брокер?
редис
редис это не брокер, это nosql) ну как вариант ставить флаг занятости очереди в редисе. или взять брокеры, которые из коробки это умеют. кролик или кафка
громоздкое решение) Однако спасибо, почитаю, думаю это будет более грамотный шаг, чем самостоятельно за флагами следить
можешь еще в редисе в очереди lock ставить, когда туда сообщение улетает. тогда следующее будет ждать разблокировки
Обсуждают сегодня