Статьи

Комплексная обработка событий — взгляд начинающего

Использование сложной обработки событий не так сложно. Ну изначально как минимум. В Интернете доступно значительное количество информации о продуктах и ​​функциях CEP. Но, если вы похожи на меня, вы хотите протестировать продукт / приложение с небольшим терпением для чтения подробной документации. Поэтому, когда я оценивал CEP как двигатель для одного из наших будущих продуктов, я решил просто опробовать его, используя бизнес-сценарий, который я знал по своему прошлому опыту работы с финансовой компанией. Для таких нетерпеливых разработчиков, как я, что может быть лучше, чем использование бесплатного продукта с открытым исходным кодом. Поэтому я решил использовать «Esper», продукт с открытым исходным кодом, основанный на Java, и смог написать код (всего 3 java-класса) для решения бизнес-задачи, приведенной ниже.

Но сначала немного о CEP и бесстыдной заглушке нашего продукта. Мои извинения. 🙂
Комплексная обработка событий в последнее время набирает обороты. Преимущества CEP широко распространены в некоторых отраслях, таких как финансовая и страховая отрасли, где она активно используется для решения различных важных бизнес-задач. Мониторинг, обнаружение мошенничества и алгоритмическая торговля являются одними из тех критических задач, которые зависят от CEP для интеграции нескольких потоков данных в реальном времени, выявления закономерностей и создания действенных событий для организации.
Мой нынешний работодатель, Sybase Inc, является одним из ведущих поставщиков CEP. Aleri, продукт Sybase CEP, широко используется в индустрии финансовых услуг и является основным компонентом ведущего решения Sybase, «RAP — The Trading Edition». Aleri также продается как отдельный продукт. Подробная информация о продукте доступна здесь.
http://www.sybase.com/products/financialservicessolutions/complex-event-processing .

Архитектура высокого уровня приложения CEP показана на диаграмме ниже.

Теперь перейдем к лучшей части. Бизнес-требования. Важным аспектом CEP, который меня очаровывает, является его способность связывать события или точки данных из разных потоков или из одного потока данных. Для уточнения возьмем пример розничного банка, в котором установлена ​​система мониторинга мошенничества. Система помечает каждую транзакцию наличными на сумму более 10000 долларов США для просмотра вручную Это означает, что крупная кассовая операция (пополнение или снятие средств) на счете вызывает событие противодействия отмыванию денег из системы мониторинга. Такие традиционные системы мониторинга можно легко обойти / использовать с помощью простых приемов, таких как внесение более одного чека с меньшими суммами. Что произойдет, если владелец счета внесет 2 чека по 6000 долларов в день или 5 чеков по 2500 долларов в день? Ничего. Система не может поймать это. CEP предоставляет способ определения правил с критерием временных рамок. Например, вы можете указать правило для поднятия флага, когда кто-то вносит более 10000 долларов наличными в 12-часовом окне. Возьми?
Следуйте приведенным ниже инструкциям, чтобы увидеть, насколько легко внедрить CEP для удовлетворения этого бизнес-требования.
Загрузите последнюю версию Esper (4.5.0 на момент написания этой статьи) отсюда.
http://espertech.com/download/
Распакуйте пакет в отдельную папку.
Создайте проект Java и создайте ссылку на файлы Esper jar из этой папки.
Создайте стандартный Java-бин для события — здесь депозитный счет с атрибутами имени и суммы.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package com.sybase.testTools.util;
 
import com.espertech.esper.client.EventBean;
 
public class DepositEvent {
 private String accountName;
 private int amount;
 
 public DepositEvent(String accountName, int amount) {
  this.accountName = accountName;
  this.amount = amount;
 }
 
 public String getAccountName() {
  return accountName;
 }
 
 public int getAmount() {
  return amount;
 }
}

Следующий листинг предназначен для создания типа события, SQL-подобного запроса для создания события и регистрации прослушивателя по этому запросу. Код генерирует событие каждый раз, когда один из двух депозитных счетов AccountA и AccountB депонируется с более чем 100000 в течение 10 секунд (здесь вы указываете временное окно). Поскольку это всего лишь тест, я соединил функциональность генерации событий с другим кодом, но в реальной жизни суммы депозита будут поступать из системы обработки транзакций депозита, основанной на некоторой структуре обмена сообщениями. Код достаточно прост, чтобы следовать. Сначала мы создаем начальную конфигурацию. Затем мы добавляем желаемый тип события. Далее создается запрос с критерием выбора события. Как вы можете видеть, сумма суммируется по скользящим окнам за 10 секунд, и это создает событие, когда общая сумма в этом временном интервале для конкретной учетной записи превышает 100000. Следующий слушатель создается и регистрируется в запросе.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.sybase.testTools;
 
import org.apache.log4j.BasicConfigurator;
 
import com.espertech.esper.client.Configuration;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.sybase.testTools.util.MyListener;
import com.sybase.testTools.util.DepositEvent;
 
public class EsperTest {
 public static void main(String args[]) {
  try {
   Configuration config = new Configuration();
 
   config.addEventType("DepositEvent",
     com.sybase.testTools.util.DepositEvent.class
       .getName());
   EPServiceProvider epService = EPServiceProviderManager
     .getDefaultProvider(config);
   String expression = "select accountName, sum(amount) from com.sybase.testTools.util.DepositEvent.win:time(10 seconds)"
     + " group by accountName having sum(amount) > 100000";
 
   EPStatement statement = epService.getEPAdministrator().createEPL(
     expression);
   MyListener listener = new MyListener();
   statement.addListener(listener);
   int amount = 0;
   for (int i = 0; i < 1000; i++) {
    amount = i;
    DepositEvent event;
    if (i % 2 == 0) {
     event = new DepositEvent("AccountA", amount);
    } else {
     event = new DepositEvent("AccountB", amount);
    }
    epService.getEPRuntime().sendEvent(event);
   }
 
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

Следующий список — слушатель. Каждый раз, когда событие генерируется во временном окне, указанном в запросе, оно добавляется в коллекцию newEvents.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.sybase.testTools.util;
 
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener;
 
public class MyListener implements UpdateListener {
 public void update(EventBean[] newEvents, EventBean[] oldEvents) {
  try {
   if (newEvents == null) {
 
    return;
   }
   EventBean event = newEvents[0];
   System.out.println("Account: " + event.get("accountName")
     + ", exceeded the sum, actual " + event.get("sum(amount)"));
  } catch (Exception e) {
   e.printStackTrace();
  }
 
 }
 
}

Достаточно просто, правда? Сам язык выражений довольно легко понять из-за его сходства со стандартным синтаксисом SQL. Хотя реальная реализация может стать сложной в зависимости от типа и количества каналов и событий, которые вы хотите отслеживать, сам по себе продукт достаточно прост для понимания. Многие из коммерческих продуктов CEP предлагают отличный пользовательский интерфейс для создания типов событий, запросов и отчетов.

Комплексная обработка событий все еще остается растущей областью, и темпы ее принятия будут только увеличиваться, поскольку компании пытаются разобраться во всех потоках данных, поступающих в них. Объем полуструктурированных и других типов данных (аудио, видео) уже превысил количество традиционных реляционных данных. Легко оценить влияние хороших приложений CEP в то время, когда компании, торгующие на биржах, уже собирают подсказки из твитов в твиттере.

Справка: Комплексная обработка событий — взгляд новичка от нашего партнера по JCG Махеша Гаджила в простом, но практичном блоге.