Коллеги, приветствую.
Есть задача организации очереди задач, работающие со сторонним API, который мы должны дергать с определенной периодичностью.
Пример: есть задача, которая:
- Берет что-то из базы
- Делает запрос к удаленному серверу
- Получая ответ, записывает что-то в базу
Запросы со всех задач на сервер должны идти, скажем, не чаще чем раз в 1 секунду. А раз в несколько минут мы должны иметь возможность останавливать все запросы к серверу на несколько секунд.
Сейчас у нас используется Celery (через gevent в 10 потоков) + Redis, хостимся на AWS. Все работает синхронно - взяли из базы что, дернули сервер, подождали 1-2 секунды, записали что-то базу. Когда сервер начинает отвечать медленно, начинаются проблемы: мы много времени просто ожидаем ответ от сервера и задачи начинают выполнять медленнее. Задача: приблизится к требуемой частоте запросов и делать запросы не чаще, но и не реже.
Переписывать все на asyncio/aiohttp не хочется, но, похоже, придется. Однако есть еще одно требование: масштабируемость решения. В идеале, если мы поймем, что одного сервера недостаточно, втыкаем второй сервер и вот эта очередь запросов, которые должны делаться к серверу не чаще чем раз в секунду, должна работать распределенно.
Кто решал подобные задачи, подскажите, в какую сторону копать?