Демон для обработки очереди

WMix

герр M:)ller
Партнер клуба
А зачем, вообще, очередь?
у очереди реализована подписка: на одно событие может одновременно могут запустится несколько обработчиков, это удобная абстракция между системами, оптимированная на быструю доставку.
трансляция состояния без гарантий доставки.
одно дело перевод, другое успешное окончание транзакции. те. отдать событие на перевод не означает ее завершение, необходим обратный вызов.
с классическими online-переводами wm или paypal тебя обратный вызов не смущает же.
 

fixxxer

К.О.
Партнер клуба
Вот кстати да, все помнят о гарантии доставки, но почему-то редко вспоминают о гарантии обработки.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
у очереди реализована подписка: на одно событие может одновременно могут запустится несколько обработчиков, это удобная абстракция между системами, оптимированная на быструю доставку.
чаще встречается задача, когда в алгоритме очереди исключается получение одной задачи двумя обработчиками одновременно
одно дело перевод, другое успешное окончание транзакции. те. отдать событие на перевод не означает ее завершение, необходим обратный вызов.
с классическими online-переводами wm или paypal тебя обратный вызов не смущает же.
Вот кстати да, все помнят о гарантии доставки, но почему-то редко вспоминают о гарантии обработки.
Очень даже помню, об этом мой вопрос номер три. И тут сразу другая проблема: недоступной может стать та база, в которой я ставлю статус "обрабатывается" в ходе обработки, и сменить статус на "выполнено" я не могу. Это потенциальный race condition.
 

Adelf

Administrator
Команда форума
чаще встречается задача, когда в алгоритме очереди исключается получение одной задачи двумя обработчиками одновременно
тут имеется ввиду обработка одного события разными обработчиками, которые реализуют разный функционал. не всегда нужно, но бывает полезно. Event driven!
 

WMix

герр M:)ller
Партнер клуба
И тут сразу другая проблема: недоступной может стать та база, в которой я ставлю статус "обрабатывается" в ходе обработки, и сменить статус на "выполнено" я не могу.
подумай еще раз, как это происходит при обычных онлайн платежах.
что будет если клиента отправил на paypal и тут webserver упал
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
подумай еще раз, как это происходит при обычных онлайн платежах.
что будет если клиента отправил на paypal и тут webserver упал
Paypal несколько раз постучится своим Instant Payment Notification, потом платеж потеряется.
 

WMix

герр M:)ller
Партнер клуба
у меня не терялся (хотя конечно всякое было), в последнем варианте, если стоит статус "отправил на оплату" и "время вышло", то переспрашивал платежную систему сам (были случаи, когда кидал мыло администратору на перепроверку). при отрицательном ответе платежной системы ставил статус "не оплачено"
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Что вы юзаете для базы, и какой логгер? Что-то я не вижу логгера в ReactPHP. Monolog какой-то сырой, документация плоховата, и непонятно как он будет работать в асинке.
 

fixxxer

К.О.
Партнер клуба
Нормально все с monolog, если не брать handler-ы, которые будут блокироваться. Я тупо в файлики пишу, а там уж выгрести куда надо дело техники. Можно по UDP слать.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
в приципе, все немного сложнее - надо выводить в stderr основного процесса, где его заберет docker, потому как до внешнего syslog я еще не дорос

значит, worker логи не выведет, их должен выводить управляющий процесс, это несколько усложняет ситуацию с reactphp
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Посмотрел docker-файлы для php-pm - в одном контейнере собирают и php-pm, и nginx, а логи в файл внутри контейнера, получается. Несерьезно.
 

fixxxer

К.О.
Партнер клуба
Вот вообще не проблема, монологом в stderr вывести.

А нафига это все? Запускаешь основным процессом прямо php-cli и все. Nginx с проксиком - отдельно, вместе с терминацией ssl и вот этим всем - часто такое вообще физически даже на отдельных машинах.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я так понимаю, в reactphp process manager сделали, в одном пулле несколько протоколов обрабатывают - http, web sockets, dns resolver, только асинхронной работы с базой не вижу
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
еще встретил такую штуку, https://amphp.org/packages - тут есть работа с базой, так что reactphp не один
Да те же яйца, вид сбоку. На самом деле более интересный вопрос - какой из pecl/[lib]{e|u}v[ent] собирается и нормально работает под актуальной версией php. ;)

process manager сделали, в одном пулле несколько протоколов обрабатывают - http, web sockets, dns resolver
Process manager нахрен для этого не нужен, все можно обрабатывать в рамках единственного event loop. (Опустим вопрос smp, аналог nodejs-овского cluster это банальнейшая штука при наличии posix_*).

php-pm - это вообще не про то, это такая попытка реализовать аналог перлового fastcgi на php, без полной переинициализации на каждый запрос. Такая утопическая фантазия на тему "мы вот щас запустим symfony или laravel, пробутстрапим всю тяжелую фигню один раз, а потом будем обрабатывать реквесты". Надеюсь, не надо объяснять, почему это никогда не будет работать в приложениях сложнее hello world. Ну, то есть, с очень аккуратным кодом на симфони еще может быть, но laravel - бхахаха.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Мы логи монологом пихаем в CloudWatch амазоновский.
в одном пулле несколько протоколов обрабатывают - http, web sockets, dns resolver
Ну собственно, это нормально для реактпхп, в одном евентлупе все крутить.
Про базу... в итоге мы сошлись на варианте, где пхпреакт только держит tcp/zmq коннекты к клиентам, а обрабатываем мы пакеты на вебсервере во внутренней сетке, там привычный люмен крутится, со всеми бенефитами. Во первых, экстеншны для бд не умеют в асинхронность, а пользоваться rawsql pure-php реализациями протокола мне как-то некомфортно показалось. В основном, эта схема скейлится хорошо/быстро/дешево, поэтому на ней остановились.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Мы логи монологом пихаем в CloudWatch амазоновский.

Ну собственно, это нормально для реактпхп, в одном евентлупе все крутить.
Про базу... в итоге мы сошлись на варианте, где пхпреакт только держит tcp/zmq коннекты к клиентам, а обрабатываем мы пакеты на вебсервере во внутренней сетке, там привычный люмен крутится, со всеми бенефитами.
Как вы передаете данные из reactphp-сервера в обработчик с базой?
Во первых, экстеншны для бд не умеют в асинхронность, а пользоваться rawsql pure-php реализациями протокола мне как-то некомфортно показалось.
mysqli и postgres умеют
 

fixxxer

К.О.
Партнер клуба
Поллинг - это несерьезно. Предлагаешь по таймеру каждые N микросекунд поллить?

Вообще не вижу особых проблем с протоколами, реализованными на php. На nodejs все таким же образом работает, и ничего. Другое дело, что в nodejs этим пользуются миллионы людей и все хорошо оттестировано, а с reactphp-либами - фиг его знает.

https://github.com/bixuehujin/reactphp-mysql
https://github.com/voryx/PgAsync (ух ты, порт Rx для reactphp есть, оказывается)
 
Сверху