Постоянные многоузловые события в веб-приложении без сохранения состояния в Stack Overflow

Я создаю OO PHP-приложение, которое будет работать на нескольких узлах и будет относительно без состояния по своей природе, и мне нужно реализовать надлежащего издателя-подписчика (http://en.wikipedia.org/wiki/Observer_pattern / http://sourcemaking.com/design_patterns/Observer/php) стиль событий.

У меня вопрос, как я могу обрабатывать события?

В моем приложении мы используем такие технологии, как Cassandra, Redis, Mongo и RabbitMQ.

Я знаю, что в PHP доступно событие EXTENSION, но из того, что я могу сказать, оно остается в пределах состояния — или, если используется что-то вроде memcached, его можно использовать в этом узле … но мое приложение будет распространено через несколько узлов.

Итак, давайте посмотрим на пример:
На узле 1 метрика (ID метрики 37) обновляется, и все, что подписывается на эту метрику, нуждается в обновлении. Это публикует Изменения и Изменения, поскольку это делает обновление.

У меня есть что-то, что подписано на обновляемый Metric ID 37, например, Metric 38, возможно, потребуется пересчитать себя при изменении значения Metric 37.

Метрика 38 в настоящее время создается и используется на узле 2 в идентификаторе процесса 1011 … Как метрика 37 сообщает метрике 38 в узле 2 (идентификатор процесса 1011 в этом случае) для запуска подписанной функции?

Metric 39 подписывается на обновление Metric 38, но нигде не создается … Как обновляется Metric 39 после завершения обновления Metric 38?

Я думал о чем-то вроде использования RabbitMQ в качестве моего менеджера очереди событий, и на каждом узле есть приложение-потребитель в стиле демона, которое считывает события в очереди событий (для балансировки нагрузки / распределения работы).

Затем потребитель видит «Метрика: 38: обновлено», проверяет что-то вроде Redis для всего, что подписано на «Метрика: 38: обновлено», получает значение («What: Function: Values») и делает что-то вроде call_user_func_array (array ($ what , функция $), $ значения); …. но кажется, что это может привести к дерьму нагрузки и некоторому уровню проблем с синхронизацией …

Я использую Doctrine MongoDB ODM для сохранения своих объектов … Для решения проблем синхронизации я думал о чем-то вроде этого:
Объекты могут иметь номер версии … (версия = 1.0)
И Redis может быть использован для поддержания быстрой ссылки на последнюю версию объекта (ObjectVersion: ObjectType: ObjectId) = 1.1
И когда метод get вызывается для свойства объекта, помеченного как @critical (такие вещи, как isDeleted, денежные балансы и т. Д.), Он может проверить, равен ли идентификатор версии экземпляра версии # в redis, и обновить его значения из mongo, если это необходимо. чтобы …

Альтернативная установка использует amphp/amp (http://amphp.org/docs/amp/reactor-concepts.html) и некоторая форма RPC для синхронизации узлов

Так как я довольно новичок в веб-разработке (переход от c #) и не обладаю состоянием, и распределен … Я подумал, что было бы неплохо спросить сообщество, есть ли у кого-нибудь лучшие предложения?

5

Решение

У меня вопрос, как я могу обрабатывать события?

Если вы хотите использовать реализацию цикла событий, доступно несколько вариантов:

Вы можете использовать систему PubSub, как предлагает Redis: http://redis.io/topics/pubsub. Amp предлагает пакет для Redis, другие библиотеки событий могут уже иметь доступную реализацию.

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

Вы можете поместить фактические данные в список Redis и использовать систему событий только для опроса в случае нового задания, чтобы в противном случае работники могли спать. Лучшим решением может быть использование операций со списком блокировки, которые блокируют соединение Redis, пока в списке Redis не появятся новые данные. Когда это событие происходит, вы можете пересчитать значение и отправить обновление на событие.

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

1

Другие решения

может быть нужно промежуточное программное обеспечение, как http://redis.io/topics/pubsub или какая-либо другая очередь сообщений может поддерживать ваше приложение

0