Моделируем полёт PHP на крыльях Erlang

252 views
Skip to first unread message

Volodymyr Stolyarchuk

unread,
Mar 13, 2013, 12:04:38 PM3/13/13
to erlang-...@googlegroups.com
Есть проект написаный на php и для отложеной обработки событий использовался cron, но сейчас столкнулся с проблемой что события на cron-не обрабатываются со значительной задержкой (много их). Потому наткнувшись на пост http://habrahabr.ru/post/119839/ решил сделать что-то подобное: логику обработки оставляю на php, а с помощью RabbitMQ і Erlang делаю диспетчеризацию событий.

Вопрос состоит в том как лутше работать в Erlang с RabbitMQ? Где создавать connection и channel? 
Сейчас я деляю что-то такое:
Корневый супервизор запускает супервизоры для кажной очереди из которой нужно брать задачи (список очередей береться из конфига и для кажного типа задач своя очередь), эти супервизоры в свою очередь запускают определенное в конфиге количество рабочих процесов которые получают сообщения из своей очереди и делают HTTP запрос к php-скрипту в котором реализована логика.
Сейчас в кажном рабочем процесе я делаю отдельний конект к RabbitMQ, хотя незнаю хорошо ли так делать

Сейчас еще столкнулся с проблемой: если php-скрипт недоступен, то я делаю так чтобы рабочий процес падал, но сообщение которое этот процес обрабатывал остается в RabbitMQ как Unacknowledged, (я так понимаю что из-за того что процес канала остается жить). 
Как правильно обрабатывать ошибки возникшие в рабочем процесе? Так как если он упадет по любой причине  Unacknowledged сообщения просто будут накапливаться

И еще мне нужно чтобы в ситуации когда сообщение не может быть обработано php-скриптом оно дожно ждать некоторое время. Сейчас первое что приходит в голову, это не убивать рабочий процес, а сохранять его в state-те и делать попытку повторной обработки через какое-то время

то что сделал выложил тут https://github.com/StVolodymyr/tasks_dispatcher. Так как Erlang для меня не основной язык разработки буду благодарен за замечания по приложению

Спасибо

Maxim Sokhatsky

unread,
Mar 13, 2013, 12:20:49 PM3/13/13
to erlang-...@googlegroups.com
Мы написали свою вспомогательную библиотеку для
работы с кролем и роутингом подписок. Если интересно можно
в нее подсмотреть, если влом писать -- можно ее брать и использовать:



Date: Wed, 13 Mar 2013 09:04:38 -0700
From: volodymyr....@gmail.com
To: erlang-...@googlegroups.com
Subject: Моделируем полёт PHP на крыльях Erlang
--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
---
Вы получили это сообщение, поскольку подписаны на группу Erlang по-русски.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес erlang-russia...@googlegroups.com.
Подробнее о функциях можно узнать на странице https://groups.google.com/groups/opt_out.
 
 

Bogunov

unread,
Mar 13, 2013, 1:44:26 PM3/13/13
to erlang-...@googlegroups.com
Задам тупой вопрос: зачем вобще юзать эрланг для супервизоров, но дергать пхп скрипты по хттп ?
Не легче на пхп написать pcntl_fork - запустить чайлд, субскрайб(через пхпшный враппер к раббиту) и точно так же держать N воркеров-консумеров задач из очереди ? Тем более таких решенйи на гитхабе уже вагон и тележка.
Минута гугл-фу дала следующий результат: https://github.com/facebook/libphutil/tree/master/src/daemon
Концепт OTP можно повторить на любом языке, а подход мастер + Х-воркеров  - стар, как Unix.

2013/3/13 Maxim Sokhatsky <ma...@synrc.com>



--
skype: i.bogunov
Regards, Bogunov Ilya

Volodymyr Stolyarchuk

unread,
Mar 13, 2013, 3:05:20 PM3/13/13
to erlang-...@googlegroups.com
Я бы не хотел обсуждать вопрос почему эрланг, так как куча коментариев в этом посте http://habrahabr.ru/post/119839/  как раз на эту тему "Зачем?" и разводить что-то подобное нет желания

А причина? Я не хочу иметь сотни воркеров обработчиков на php, так как на erlang это сделать проще



2013/3/13 Bogunov <bog...@gmail.com>



--
С уважением, Владимир Столярчук
тим-лидер отдела поддержки продаж

RIA.ua
тел./факс.: 0 432 555-200 (многоканальный)
моб: 0 (93) 279-17-45
e-mail:Volodymyr....@gmail.com

Yuri Zhloba

unread,
Mar 14, 2013, 2:22:54 AM3/14/13
to erlang-...@googlegroups.com
Если быть искренним, то самая главная причина: "Просто потому, что хочется попробовать новую-клевую штуку". 

Почему-то все стесняются признаться себе и другим в этом, и старательно ищут рациональные доводы. Я вот не стесняюсь. Да, мне хочется нового-клевого. И при том, что рациональные доводы сущесвуют, главная причина все-таки эта :)

Dmitry Demeshchuk

unread,
Mar 15, 2013, 10:35:42 AM3/15/13
to erlang-...@googlegroups.com
По поводу коммуникации с RMQ из эрланга – https://github.com/mochi/gen_bunny в помощь

Roman Timofeev

unread,
Mar 15, 2013, 6:29:50 PM3/15/13
to erlang-...@googlegroups.com


>
> Почему-то все стесняются признаться себе и другим в этом, и старательно ищут рациональные доводы. Я вот не стесняюсь. Да, мне хочется нового-клевого. И при том, что рациональные доводы сущесвуют, главная причина все-таки эта :)

А мы вот всегда раз двести подумаем, прежде чем что-то тащить в проект. Потому что зоопарк потом поддерживать и везде есть свои грабельки.

Sergey Prokhorov

unread,
Mar 21, 2013, 7:40:52 AM3/21/13
to erlang-...@googlegroups.com

среда, 13 марта 2013 г., 20:04:38 UTC+4 пользователь Volodymyr Stolyarchuk написал:
Вопрос состоит в том как лутше работать в Erlang с RabbitMQ? Где создавать connection и channel? 
Сейчас я деляю что-то такое:
Корневый супервизор запускает супервизоры для кажной очереди из которой нужно брать задачи (список очередей береться из конфига и для кажного типа задач своя очередь), эти супервизоры в свою очередь запускают определенное в конфиге количество рабочих процесов которые получают сообщения из своей очереди и делают HTTP запрос к php-скрипту в котором реализована логика.
Сейчас в кажном рабочем процесе я делаю отдельний конект к RabbitMQ, хотя незнаю хорошо ли так делать

Я делаю один TCP коннект (amqp_connection:start()) к RabbitMQ и открываю в нём каналы (amqp_connection:open_channel(State#state.connection)) на каждого воркера. Работает вполне ничего.
 
Сейчас еще столкнулся с проблемой: если php-скрипт недоступен, то я делаю так чтобы рабочий процес падал, но сообщение которое этот процес обрабатывал остается в RabbitMQ как Unacknowledged, (я так понимаю что из-за того что процес канала остается жить). 
Как правильно обрабатывать ошибки возникшие в рабочем процесе? Так как если он упадет по любой причине  Unacknowledged сообщения просто будут накапливаться

И еще мне нужно чтобы в ситуации когда сообщение не может быть обработано php-скриптом оно дожно ждать некоторое время. Сейчас первое что приходит в голову, это не убивать рабочий процес, а сохранять его в state-те и делать попытку повторной обработки через какое-то время
 У меня тоже воркер падает в случае ошибки, но, похоже, канал закрывается. Скорее всего потому что в воркере сделан

init([Conn, Queue]) ->
    process_flag
(trap_exit, true),
   
...


terminate
(_Reason, #state{channel=Channel} = State) when is_pid(Channel)->
    amqp_channel
:close(Channel),
   
State;
Но точно не помню уже.

Volodymyr Stolyarchuk

unread,
Mar 21, 2013, 8:17:12 AM3/21/13
to erlang-...@googlegroups.com
да, закрытие канала в terminate мне тоже помогает. Но насколько я заю terminate не всегда срабатывать когда процес умирает


2013/3/21 Sergey Prokhorov <seri...@gmail.com>

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
---
Вы получили это сообщение, поскольку подписаны на группу Erlang по-русски.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес erlang-russia...@googlegroups.com.
Подробнее о функциях можно узнать на странице https://groups.google.com/groups/opt_out.
 
 

Sergey Prokhorov

unread,
Mar 23, 2013, 6:32:20 AM3/23/13
to erlang-...@googlegroups.com
Да, на это полагаться не советую. По хорошему, нужно попробовать прилинковать процесс канала к воркеру http://www.erlang.org/doc/man/erlang.html#link-1 . Если у получится решить эту проблему иначе, чем terminate(), отпиши пожалуйста. Я просто сделал по быстрому и забил, другие способы не пробовал.

четверг, 21 марта 2013 г., 16:17:12 UTC+4 пользователь Volodymyr Stolyarchuk написал:

Dmitry Demeshchuk

unread,
Mar 23, 2013, 11:18:22 AM3/23/13
to erlang-...@googlegroups.com
Только erlang:monitor/2 в отдельном процессе.

Линки может снять любой процесс из слинкованной пары. Плюс, если где-то есть trap_exit, то линк будет бесполезен. Надо явно мониторить падение любого из процессов и убивать второй.

Max Lapshin

unread,
Mar 23, 2013, 11:29:11 AM3/23/13
to erlang-...@googlegroups.com
link ещё и не пришлет сообщение, если кто-то вышел нормально


2013/3/23 Dmitry Demeshchuk <demes...@gmail.com>
Reply all
Reply to author
Forward
0 new messages