Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Ускорение сокет сервера
Форумы портала PHP.SU » » Работа с сетью » Ускорение сокет сервера

Страниц (1): [1]
 

1. T1grOK - 28 Октября, 2015 - 12:56:13 - перейти к сообщению
Имеется PHP скрипт слушающий сокет.
К сокету подключаются клиенты. При подключении нового клиента формируется набор команд(порядка 20 запросов к БД), которые необходимо отправить клиенту.
Единомоментно может подключиться 100 клиентов.
20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5.
Соответственно как то необходимо, чтобы запросы к БД отрабатывали отдельным потоком, отдельным процессом, чтобы клиенты не ждали пока из базы, что то достанется
Пока в голову приход использовать RabbitMQ, сокет сервер будет кидать команду в RabbitMQ, тот будет раскидывать(Round Robin) команды между несколькими подписчиками, которые и будут работать с БД, а после завершения сами подключатся к сокету и скажут "для соединения 555 сформирована очередь команд. Можно продолжать работать".

Или может я слишком далеко ушел и можно решить вопрос проще?
2. MiksIr - 28 Октября, 2015 - 15:51:13 - перейти к сообщению
Можно, если знаком phpdaemon.

Там можно сделать асинхронную работу с базой.

В принципе, асинхронная работа с базой есть и нативная, но там возникает проблема, которую я не знаю как решить - как в общем loop-е слушать события и сокетов и базы. Но можно просто переодически просыпаться, выходить из ожидания по таймауту и проверять состояние базы.

Другой вариант - это запрос за данными в внешний сервис. Очередь тут излишня, ибо фишка очереди как раз, что мы не ждем результата. Здесь нужно дождаться и получить результат. Т.е. просто какой-то отдельный демон с prefork схемой. Это может быть даже банальные nginx+php-fpm.
3. DeepVarvar - 28 Октября, 2015 - 17:31:55 - перейти к сообщению
T1grOK пишет:
Единомоментно может подключиться 100 клиентов.
Покажи как реализовал это на пыхе. Мне аж интересно стало ))
T1grOK пишет:
20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5
Ну и где тут твое "единовременно"?

MiksIr пишет:
phpdaemon
Давно я про него не слышал. А когда слышал -- там была трабла на трабле. Потому что пых не многопоточный. И там что-то имитировали на форках с семафорами и шаредмемори. Т.е. по сути это просто форко-зигота. Ну а если говорить про правильные технологии параллельного обслуживания клиентов (select/poll/epoll), то это вообще не про пых.
(Добавление)
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, пока скрипт добавит каждого нового клиента в пул и выполнит стартовый сценарий - для пользователей это ожидание и не самое маленькое.

 

Powered by ExBB FM 1.0 RC1