1. grigori

    grigori ( ͡° ͜ʖ ͡°) Команда форума

    Сообщения:
    7.125
    Ваш город:
    Stormwind
    Address:
    Scottsdale, United States
    Country:
    Location on Map:
    Hi all.
    Кто пишет демонов и разбирает очереди - расскажите, какие инструменты используете, как именно делаете?

    Тут ряд вопросов.

    1. PHP рожден чтобы умирать, но иногда он уподобляется Ильичу, и вместо падения просто зависает, и перестает реагировать. Как вы обрабатываете такое?

    2. Работа в постоянном рабочем цикле с разными расширениями вроде ресайза фоток периодически приводит к утечкам памяти, и подобным проблемам.
    Как вы следите за тем, чтобы процесс работал, и как вы его убиваете?

    3. В задаче надо процессить деньги. Беру из очереди задание и ставлю ему статус "обрабатывается", чтобы другие не взяли, и текущее время. Если процесс умирает неестественно, джоба остается висеть в "обрабатывается", и непонятно сколько надо ждать, чтобы другой решился забрать задачу себе.
    Как можно избежать бесполезного ожидания?
     
  2. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.962
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    1. не сталкивался с таким
    2. если про imagick, то проблема в нем, а не в php. Банально счетчик обработанных запросов.
    3. мне всегда хватало "по таймауту". Альтернативный вариант - мониторить процессы, но не вижу смысла - процессы неестественно умирают крайне редко.

    Вообще если процессы постоянно пухнут и умирают, надо с этим разбираться, это уже давно совершенно ненормально.
     
  3. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.367
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    (2) на задачу новый процесс обычно создается, чтоб рожденный умирать умирал, демон да были моменты, вис, но уже 2 года ровненько.. ну те он нет нет перезапускается, когда деплоим (до 4х раз в неделю легко)
    (3) таймаут + номер процесса
     
  4. grigori

    grigori ( ͡° ͜ʖ ͡°) Команда форума

    Сообщения:
    7.125
    Ваш город:
    Stormwind
    Address:
    Scottsdale, United States
    Country:
    Location on Map:
    проблема 1 - это по памяти, много лет назад так было

    чем запускаете процесс и перезапускаете при отмирании оного?

    да, вопрос 4) как из fpm-процесса по событию на сайте дернуть демон?
     
  5. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.359
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    да полно таких тулз. тот же supervisord.

    задача в очередь ставится. которую демон возьмет. не надо веб-процессу с демоном напрямую общаться. не по-христиански это.
     
    Andkorol, WMix, fixxxer и ещё 1-му нравится это.
  6. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.962
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Штатным инитом (systemd, upstart). SysV init уже почти нигде не встречается, давно, когда встречался - ставил runit (не заменяя sysv, просто сбоку).

    Если это важно - как Adelf сказал, если что-то некритичное типа допускающей неточности статистики а-ля pinba - udp-пакетом.
     
    Последнее редактирование: 3 фев 2018
  7. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.954
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    Как семерка вышла, висит запущенным месяцами без подтекания практически.
    Раньше штатным инитом, сейчас — supervisord (чутка удобней/универсальней деплоить конфиги для супервизора, чем штатные)

    Удп-пакетом, или нагло, сигналом (у меня в одном месте такое есть, не продакшн!)
    Но в целом мы пихаем в очередь, и демон сам разбирает.
    Еще из вариантов для событий (правда, между двумя демонами) мы использовали ZMQ он ничо так, но подтекал.

    Если прям хочется изолироватся, я бы форкал per-job процессы, хранил пид, мониторил сигнал смерти, и высвобождал задачу в мониторящем процессе если исполнитель умер. Правда немного кажется пушкой по воробьям, но могу представить задачу, где каждая милисекунда на счету.

    Вообще, я раньше сильно топил за phpdaemon в котором поддержка мониторинга своих же воркеров/рестарт по памяти/IPC из-коробки, и у меня все еще есть код, написанный под него, на сервер с которым я не заглядывал пару лет, и он сам там крутится, но его код, и код написанный под него абсолютно невозможно мантейнить. Его можно написать, забыть и простить, но поддерживать очень тяжело.
    Поэтому мы переезжаем на reactphp, он очень аккуратный, но кучу всего приходится писать самому.
     
  8. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.367
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    для веба тоже или только демоном?
     
  9. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.954
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    у нас веба кроме админок особо нет, и там мы тихонечко в сторону vue spa движемся. Я честно говоря, вот в эти штуки «запусти симфони через евентлуп что бы сайты сервить» не очень верю.
     
  10. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.367
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    а ppm?, он многообещающий. у меня прям руки чешутся ядрышко перелопатить под react причем все и клиента и консольку и зокеты
     
  11. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.954
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    Вот я его и имел ввиду говоря про
     
  12. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.367
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    я в глубине души тоже так думаю, но желание свой пул создать будоражит мозг, полет фантазий, все коннекшины в одной обертке, ассинхронные ответы через зокеты без попоболь... аааа хочу)
     
  13. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    4.708
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Зависает обычно не сам PHP а какие-то отдельные функции.
    У меня это часто коннекты к внешним сервисам. Решается явным заданием таймаутов соединения и чтения. Уже лет пять нет проблем.

    imagick надо обновлять вовремя.

    См. п.1.
     
  14. grigori

    grigori ( ͡° ͜ʖ ͡°) Команда форума

    Сообщения:
    7.125
    Ваш город:
    Stormwind
    Address:
    Scottsdale, United States
    Country:
    Location on Map:
    Спасибо.
    Думаю теперь, лень мне ставить редис для очереди, или не лень.
    MySQL тяжеловат для этого - у меня много параллельных очередей вырисовывается. А кролика не хочу - он теряет при ребуте, для денег это недопустимо.
     
    Последнее редактирование: 3 фев 2018
  15. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.367
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    зачем из базы очередь делать?
    и зачем из очереди базу
     
  16. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    4.708
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Это две разных задачи, не стоит пытаться их решить одним инструментом.
    В БД хранится "постоянная" часть данных, а в очереди - очередь, т.е. то, что можно в любой момент восстановить.
     
    alekciy нравится это.
  17. grigori

    grigori ( ͡° ͜ʖ ͡°) Команда форума

    Сообщения:
    7.125
    Ваш город:
    Stormwind
    Address:
    Scottsdale, United States
    Country:
    Location on Map:
    А зачем, вообще, очередь? Записать задание в файл, и пнуть демон через posix_kill ... ну, или в открытый сокет свиснуть. Это плохо масштабируется и неудобно деплоится. Например, это плохо ложится в контеййнеры.
    Задачу нужно передавать по сети, и хранить где-то в специальном месте.

    Кролик делает pub/sub, трансляция состояния без гарантий доставки. Получается, что обработчику при старте надо заглянуть в базу, и забрать задания, а потом реагировать на уведомления о новых заданиях. Но уведомление можно как угодно отправить - просто соединением на tcp-порт, например.

    Что я понимаю неправильно?
     
    Последнее редактирование: 4 фев 2018
  18. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.962
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Redis-овский pub-sub тогда тоже не подойдет. Но на redis можно сделать надежную очередь через RPOPLPUSH и LUA-скрипты: https://redis.io/commands/rpoplpush
     
  19. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.954
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    В ZMQ кстати, пакеты с подтверждением, хер потеряешь (даже если хочешь очередь сбросить :D )
     
  20. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.962
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Я его как-то боюсь. Слишком много магии. В продакшен потащить бы побоялся. Обосновать не могу, просто ощущение такое.