Как поставить в очередь GET запросы в API?

Есть сервис со звонками на PHP.
PHP приложение передает на сервер с Asterisk GET запрос с номером телефона.
На сервере Asterisk есть обработчик, который принимает GET запросы с номером телефона, после запроса передает данные в Asteriks идет звонок на данный номер.
У нас есть ограничение, не более 10 одновременных звонков.

Как можно ограничить кол-во одновременных запросов до 10, а остальных поставить в очередь?

Думаю в сторону Beanstalkd. PHP приложение отправляет запрос с данными на сервер Beanstalkd, далее Worker получая задачу делает запрос к Asterisk.
Правильно ли я мыслю? Если да, то как можно ограничить в Beanstalkd кол-во этих соединений до 10 одновременных или они просто последовательно обрабатываются?
Ни разу не сталкивался с очередями, так что сильное не пинайте.
  • Вопрос задан
  • 424 просмотра
Пригласить эксперта
Ответы на вопрос 2
bubandos
@bubandos
bash'у, javascript'ую, php'лю, css'аю, html'каю
Элементарная очередь, которая легко делается связкой php(или любой другой яп)+mysql (или любое другое хранилище).
С сайта - пишете в таблицу нужные данные: номер телефона, звонок выполнен или нет, метка обработчика, id (с автоинкрементом).
В фоне запускаете нужное количество обработчиков (хоть сто), каждый обработчик раз в сколько-то секунд работает по такому принципу: update queue set worker_id = $id_of_worker where worker_id = null order by id limit 1, а дальше select * from queue where worker_id = $id_of_worker.
После того, как получили и отзвонились, записываем все в лог и делаем delete from queue where worker_id = $id_of_worker.

Делается за пол часа, очередь из миллионов запросов разбирается за считанные минуты.
Ответ написан
Комментировать
Предлагаю такой алгоритм.
Считаете количество активных вызовов в Астериск (легко делается, пример найти не сложно гуглом).
В очередь прилетает, предположим, 15 вызовов. Ваш воркер начинает хватать вызовы из очереди и скармливать астериску, пока не получит от него в ответ: "хватит, уже 10 активных вызовов идет". Воркер пытается подпихивать вызовы с некоторой периодичностью, пока астериск не сможет их принять
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы