Имеется PHP скрипт слушающий сокет.
К сокету подключаются клиенты. При подключении нового клиента формируется набор команд(порядка 20 запросов к БД), которые необходимо отправить клиенту.
Единомоментно может подключиться 100 клиентов.
20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5.
Соответственно как то необходимо, чтобы запросы к БД отрабатывали отдельным потоком, отдельным процессом, чтобы клиенты не ждали пока из базы, что то достанется
Пока в голову приход использовать RabbitMQ, сокет сервер будет кидать команду в RabbitMQ, тот будет раскидывать(Round Robin) команды между несколькими подписчиками, которые и будут работать с БД, а после завершения сами подключатся к сокету и скажут "для соединения 555 сформирована очередь команд. Можно продолжать работать".
Или может я слишком далеко ушел и можно решить вопрос проще?
1. T1grOK - 28 Октября, 2015 - 12:56:13 - перейти к сообщению
2. MiksIr - 28 Октября, 2015 - 15:51:13 - перейти к сообщению
Можно, если знаком phpdaemon.
Там можно сделать асинхронную работу с базой.
В принципе, асинхронная работа с базой есть и нативная, но там возникает проблема, которую я не знаю как решить - как в общем loop-е слушать события и сокетов и базы. Но можно просто переодически просыпаться, выходить из ожидания по таймауту и проверять состояние базы.
Другой вариант - это запрос за данными в внешний сервис. Очередь тут излишня, ибо фишка очереди как раз, что мы не ждем результата. Здесь нужно дождаться и получить результат. Т.е. просто какой-то отдельный демон с prefork схемой. Это может быть даже банальные nginx+php-fpm.
Там можно сделать асинхронную работу с базой.
В принципе, асинхронная работа с базой есть и нативная, но там возникает проблема, которую я не знаю как решить - как в общем loop-е слушать события и сокетов и базы. Но можно просто переодически просыпаться, выходить из ожидания по таймауту и проверять состояние базы.
Другой вариант - это запрос за данными в внешний сервис. Очередь тут излишня, ибо фишка очереди как раз, что мы не ждем результата. Здесь нужно дождаться и получить результат. Т.е. просто какой-то отдельный демон с prefork схемой. Это может быть даже банальные nginx+php-fpm.
3. DeepVarvar - 28 Октября, 2015 - 17:31:55 - перейти к сообщению
T1grOK пишет:
Покажи как реализовал это на пыхе. Мне аж интересно стало ))Единомоментно может подключиться 100 клиентов.
T1grOK пишет:
Ну и где тут твое "единовременно"?20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5
MiksIr пишет:
Давно я про него не слышал. А когда слышал -- там была трабла на трабле. Потому что пых не многопоточный. И там что-то имитировали на форках с семафорами и шаредмемори. Т.е. по сути это просто форко-зигота. Ну а если говорить про правильные технологии параллельного обслуживания клиентов (select/poll/epoll), то это вообще не про пых.phpdaemon
(Добавление)
MiksIr пишет:
Вот буквально в понедельник доделал одну шнягу которая получала ответ с готовым через некоторое время результатом. Типа того:Здесь нужно дождаться и получить результат
1) отправляем запрос фильтрации, получаем в ответ статус и хеш (от параметров фильтрации).
2)
........а) если статус равно комплит -- гото пункт 3.
........б) если статус ворк или реквест, поспали секунду и сделав запрос на статусочекалку, гото пункт 2.
........в) если статус эррор, ничего не поделаешь.
3) получили готовый ответ.
4. MiksIr - 28 Октября, 2015 - 19:24:10 - перейти к сообщению
DeepVarvar пишет:
Т.е. по сути это просто форко-зигота. Ну а если говорить про правильные технологии параллельного обслуживания клиентов (select/poll/epoll), то это вообще не про пых.
Все есть и все работает.
5. T1grOK - 04 Ноября, 2015 - 08:43:44 - перейти к сообщению
DeepVarvar пишет:
Покажи как реализовал это на пыхе. Мне аж интересно стало ))
DeepVarvar пишет:
Ну и где тут твое "единовременно"?
С точки зрения пользователей единовременно.
Подключилось 100 пользователей в 10:00:00, пока скрипт добавит каждого нового клиента в пул и выполнит стартовый сценарий - для пользователей это ожидание и не самое маленькое.