Я создаю 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 #) и не обладаю состоянием, и распределен … Я подумал, что было бы неплохо спросить сообщество, есть ли у кого-нибудь лучшие предложения?
У меня вопрос, как я могу обрабатывать события?
Если вы хотите использовать реализацию цикла событий, доступно несколько вариантов:
Вы можете использовать систему PubSub, как предлагает Redis: http://redis.io/topics/pubsub. Amp предлагает пакет для Redis, другие библиотеки событий могут уже иметь доступную реализацию.
Redis отправит уведомление о событии всем подключенным и прослушивающим клиентам. Вы можете этого не хотеть, потому что вы хотите синхронизировать свои вычисления и выполнять их только один раз.
Вы можете поместить фактические данные в список Redis и использовать систему событий только для опроса в случае нового задания, чтобы в противном случае работники могли спать. Лучшим решением может быть использование операций со списком блокировки, которые блокируют соединение Redis, пока в списке Redis не появятся новые данные. Когда это событие происходит, вы можете пересчитать значение и отправить обновление на событие.
По сути, это создание очереди сообщений с помощью Redis, но, по сути, вы просто захотите взглянуть на функции различных реализаций очереди сообщений и посмотреть, соответствуют ли они вашим потребностям. Если вы хотите использовать какую-либо из библиотек цикла обработки событий, вы также можете посмотреть на доступные клиенты и другие функции, которые вам нужны от них, потому что они, как правило, несовместимы (пока).
может быть нужно промежуточное программное обеспечение, как http://redis.io/topics/pubsub или какая-либо другая очередь сообщений может поддерживать ваше приложение