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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Ускорение сокет сервера
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
Имеется PHP скрипт слушающий сокет.
К сокету подключаются клиенты. При подключении нового клиента формируется набор команд(порядка 20 запросов к БД), которые необходимо отправить клиенту.
Единомоментно может подключиться 100 клиентов.
20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5.
Соответственно как то необходимо, чтобы запросы к БД отрабатывали отдельным потоком, отдельным процессом, чтобы клиенты не ждали пока из базы, что то достанется
Пока в голову приход использовать RabbitMQ, сокет сервер будет кидать команду в RabbitMQ, тот будет раскидывать(Round Robin) команды между несколькими подписчиками, которые и будут работать с БД, а после завершения сами подключатся к сокету и скажут "для соединения 555 сформирована очередь команд. Можно продолжать работать".
Или может я слишком далеко ушел и можно решить вопрос проще?
----- Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
MiksIr
Отправлено: 28 Октября, 2015 - 15:51:13
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
Можно, если знаком phpdaemon.
Там можно сделать асинхронную работу с базой.
В принципе, асинхронная работа с базой есть и нативная, но там возникает проблема, которую я не знаю как решить - как в общем loop-е слушать события и сокетов и базы. Но можно просто переодически просыпаться, выходить из ожидания по таймауту и проверять состояние базы.
Другой вариант - это запрос за данными в внешний сервис. Очередь тут излишня, ибо фишка очереди как раз, что мы не ждем результата. Здесь нужно дождаться и получить результат. Т.е. просто какой-то отдельный демон с prefork схемой. Это может быть даже банальные nginx+php-fpm.
----- self-banned
DeepVarvar
Отправлено: 28 Октября, 2015 - 17:31:55
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
T1grOK пишет:
Единомоментно может подключиться 100 клиентов.
Покажи как реализовал это на пыхе. Мне аж интересно стало ))
T1grOK пишет:
20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5
Ну и где тут твое "единовременно"?
MiksIr пишет:
phpdaemon
Давно я про него не слышал. А когда слышал -- там была трабла на трабле. Потому что пых не многопоточный. И там что-то имитировали на форках с семафорами и шаредмемори. Т.е. по сути это просто форко-зигота. Ну а если говорить про правильные технологии параллельного обслуживания клиентов (select/poll/epoll), то это вообще не про пых. (Добавление)
MiksIr пишет:
Здесь нужно дождаться и получить результат
Вот буквально в понедельник доделал одну шнягу которая получала ответ с готовым через некоторое время результатом. Типа того:
1) отправляем запрос фильтрации, получаем в ответ статус и хеш (от параметров фильтрации).
2)
........а) если статус равно комплит -- гото пункт 3.
........б) если статус ворк или реквест, поспали секунду и сделав запрос на статусочекалку, гото пункт 2.
........в) если статус эррор, ничего не поделаешь.
3) получили готовый ответ.
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
DeepVarvar пишет:
Т.е. по сути это просто форко-зигота. Ну а если говорить про правильные технологии параллельного обслуживания клиентов (select/poll/epoll), то это вообще не про пых.
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
DeepVarvar пишет:
Покажи как реализовал это на пыхе. Мне аж интересно стало ))
DeepVarvar пишет:
Ну и где тут твое "единовременно"?
С точки зрения пользователей единовременно.
Подключилось 100 пользователей в 10:00:00, пока скрипт добавит каждого нового клиента в пул и выполнит стартовый сценарий - для пользователей это ожидание и не самое маленькое.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.