2014-06-12 5 views
0

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

На внутреннем интерфейсе мы имеем й число услуг, распределенные по виртуальным машинам , каждый из которых предоставляет одну и ту же услугу (распределенная репликация). Эти службы прослушивают распределенную шину событий (например, Hazelcast).

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

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

Так это решение требует асинхронной архитектуры распределенного события с запросом/ответом.

Кто-нибудь знает какие-либо масштабируемые решения в этом пространстве. Я посмотрел на Hazelcast, но механизм событий означает, что все слушатели получат это событие. Я посмотрел на службу Executor, но это отправляет код другим узлам, а то, что я ищу, - это другой узел для обработки запроса.

ответ

3

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

  • отправить всем членам
  • отправить подмножество членов
  • отправить любому члену (не важно какой)
  • отправьте конкретному участнику
  • отправьте члену, которому принадлежит конкретный раздел.

Существует также возможность использовать будущее, и вы можете комбинировать будущее с механизмом обратного вызова async, если вы не хотите блокировать. И исполнитель не отправит код на узел; код (байт-код) уже существует. Таким образом, вы просто отправляете данные.

Другим вариантом является создание решения от точки к точке, если вы не хотите уведомлять всех, но только конкретный член. Это можно сделать с помощью IQueue.

Смежные вопросы