Статьи

Событийная разработка с Mycila Event

Я работаю над бэкэндом высокопроизводительной кластерной системы, включающей JGroups , JMS и другие очень крутые технологии. Для достижения максимальной производительности приложение полностью управляется событиями, используя очень классную библиотеку i Open- Sourced : Mycila Event . Мне была нужна внутрипроцессная система диспетчеризации событий, способная обрабатывать миллионы событий за несколько секунд, имея полностью настраиваемую модель потоков. В этом приложении эта система событий внутренне соединена с JMS и JGroups, чтобы обеспечить доступ к обеим системам обмена сообщениями из Mycila Event .

Я сначала подумал об использовании Event-Busхорошо известная внутрипроцессная библиотека событий, широко используемая в приложениях Swing. Но нам не хватало многих вещей, в которых мы нуждались: очень хорошая поддержка аннотаций, подключаемый API, настройка модели потоков и лучшие стратегии сопоставления тем. Я также действительно думал об использовании Esper . Esper — очень хороший механизм CEP, способный обрабатывать события (агрегат, фильтр и т. Д.), А также очень хорошая система диспетчеризации событий. Но нам нужно зависеть от высокоуровневого API диспетчера событий с очень хорошей поддержкой аннотаций с возможностью подключения любой библиотеки диспетчера событий. Нам также не нужны были функции обработки Esper, но вместо этого нам нужен был диспетчер с очень высокой производительностью, работающий только в памяти.

Таким образом, Mycila-Eventстоит между Event-Bus и Esper. Он предоставляет вам общий API диспетчера событий с очень хорошей поддержкой аннотаций, а также предоставляет реализацию по умолчанию с несколькими моделями потоков, и вы можете создавать свои собственные. Его цель — не быть системой обработки событий (если она действительно может быть интегрирована с Esper с разработанным нами общим API). Вместо этого его цель — стать лучшей настраиваемой системой диспетчеризации.

Вот некоторые из особенностей Mycila Event:

  • API-интерфейс событий высокого уровня с поддержкой аннотаций, совместимый с любым диспетчерами событий (event-bus, Esper, …)
  • Высокопроизводительный диспетчер событий
  • Настраиваемые стратегии диспетчеризации (контроль за выполнением диспетчеризации)
  • Настраиваемая модель потоков (укажите собственных исполнителей)
  • Асинхронный режим (публикация / подписка)
  • Синхронный режим (запрос / ответ) с поддержкой тайм-аута
  • Смешанный режим: запрос с асинхронными ответами
  • Сопоставители тем и функции композиции (т.е. подписка на все темы app / events / system / **)
  • Обработка исключений позволяет реагировать на ошибки абонента
  • Автоматическая генерация издателей
  • Очень хорошая интеграция с Google Guice
  • Возможна интеграция с Spring, Esper, Camel, JMS, …

Всем известен шаблон подписчика издателя. Но вот пример, как написать запрос / ответ, который проходит через диспетчер событий:

static abstract class DU {
@Request(topic = "system/mult")
abstract int mult(int p1, int p2);

@Answers(topics = "system/mult")
int multRequest(int p1, int p2) {
return p1 * p2;
}
}

Dispatcher dispatcher = Dispatchers.synchronousSafe(ErrorHandlers.rethrow());
AnnotationProcessor processor = AnnotationProcessors.create(dispatcher);
Du du = processor.proxy(DU.class);
assertEquals(30, du.mult(5, 6))

Без аннотаций вы можете опубликовать следующее сообщение:

Dispatcher dispatcher = Dispatchers.synchronousUnsafe(ErrorHandlers.rethrow());
TopicMatcher matcher = only("app/events/swing/button").or(matching("app/events/swing/fields/**"));

dispatcher.subscribe(matcher, String.class, new Subscriber<String>() {
public void onEvent(Event<String> event) throws Exception {
System.out.println("Received: " + event.getSource());
}
});

dispatcher.publish(topic("app/events/swing/button"), "Hello !");

Вы можете прочитать полную документацию и загрузить Mycila Event со страницы проекта по адресу:

http://code.mycila.com/wiki/MycilaEvent

Math»