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 :: Ускорение сокет сервера

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Ускорение сокет сервера
T1grOK
Отправлено: 28 Октября, 2015 - 12:56:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 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
 
 Top
MiksIr
Отправлено: 28 Октября, 2015 - 15:51:13
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Можно, если знаком phpdaemon.

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

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

Другой вариант - это запрос за данными в внешний сервис. Очередь тут излишня, ибо фишка очереди как раз, что мы не ждем результата. Здесь нужно дождаться и получить результат. Т.е. просто какой-то отдельный демон с prefork схемой. Это может быть даже банальные nginx+php-fpm.


-----
self-banned
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Октября, 2015 - 17:31:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




T1grOK пишет:
Единомоментно может подключиться 100 клиентов.
Покажи как реализовал это на пыхе. Мне аж интересно стало ))
T1grOK пишет:
20 запросов выполняются порядка 0.05 секунды, то последний клиент получит ответ только секунд через 5
Ну и где тут твое "единовременно"?

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

1) отправляем запрос фильтрации, получаем в ответ статус и хеш (от параметров фильтрации).
2)
........а) если статус равно комплит -- гото пункт 3.
........б) если статус ворк или реквест, поспали секунду и сделав запрос на статусочекалку, гото пункт 2.
........в) если статус эррор, ничего не поделаешь.
3) получили готовый ответ.
 
 Top
MiksIr
Отправлено: 28 Октября, 2015 - 19:24:10
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


DeepVarvar пишет:
Т.е. по сути это просто форко-зигота. Ну а если говорить про правильные технологии параллельного обслуживания клиентов (select/poll/epoll), то это вообще не про пых.

Все есть и все работает.

(Отредактировано автором: 28 Октября, 2015 - 19:25:43)



-----
self-banned
 
 Top
T1grOK
Отправлено: 04 Ноября, 2015 - 08:43:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013  


Помог: 7 раз(а)




DeepVarvar пишет:
Покажи как реализовал это на пыхе. Мне аж интересно стало ))
DeepVarvar пишет:
Ну и где тут твое "единовременно"?

С точки зрения пользователей единовременно.
Подключилось 100 пользователей в 10:00:00, пока скрипт добавит каждого нового клиента в пул и выполнит стартовый сценарий - для пользователей это ожидание и не самое маленькое.

(Отредактировано автором: 04 Ноября, 2015 - 08:47:42)



-----
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB