Я работаю над бэкэндом высокопроизводительной кластерной системы, включающей 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»