CEP/ESP permite processar fluxos de eventos e avaliá-los contra "queries" registadas, despoletando listeners quando as condições são satisfeitas. A Esper é uma framework de CEP/ESP que oferece uma linguagem de processamento de eventos (EPL) fácil de aprender e um pequeno footprint, tornando-a fácil de incluir em código existente. A Esper ajuda a resolver problemas comuns em aplicações baseadas em eventos.
2. Processamento de eventos com Esper
2010/062/19
Sobre mim
• Trabalho numa empresa que faz localização de viaturas
em tempo real
• Desenvolvo em Java desde 2001
• Tenho particular interesse em tudo o que “flutua” em
torno do Java
• Entusiasta de desenvolvimento em geral
3. Processamento de eventos com Esper
2010/063/19
Agenda
- Eventos
- Processamento de eventos
- Esper / NEsper (.NET)
- Resumo / Mais informação
- Questões
4. Processamento de eventos com Esper
2010/064/19
Eventos
• Um evento caracteriza a alteração de um estado. Pode
ser:
– Uma cotação
– O acknowlegde de um pagamento
– Uma alteração de password
– A medição de um sensor de pressão a cada 30 segundos
– O tempo de resposta de um serviço
• Pode ser representado por:
– XML
– POJO (Plain Old Java Object)
– Pares chave/valor
5. Processamento de eventos com Esper
2010/065/19
Processamento de eventos
• Estamos habituados a guardar a informação e depois
executar queries para a obter e agir quando detectamos
determinado padrão
• No processamento de eventos a filosofia é diferente:
Criamos as condições que queremos identificar e depois
injectamos os dados no motor de eventos de forma a
sermos notificados de quando determinada condição for
identificada. Ou seja, primeiro definimos as “queries” e
só depois introduzimos informação.
6. Processamento de eventos com Esper
2010/066/19
Requisitos para o processamento de eventos
• Eventos podem estar relacionados:
– Temporalmente
– Ordem
– Casualidade (aconteceu antes/depois)
– ...
• Fluxos de eventos
– Grande fluxo, alta disponibilidade
• Eventos alteram o seu estado frequentemente
– Baixa latência de processamento
• Quando A então B
– Utilização fácil e intuitiva
7. Processamento de eventos com Esper
2010/067/19
Definições
• ESP – Event Stream Processing
– Processamento de fluxos de eventos
• Faz a monitorização de dados de eventos, analiza-os e age em conformidade
• ex: valor médio das acções da Brisa nos últimos 30 minutos
• CEP – Complex Event Processing
– Detecção de padrões dentro do(s) fluxo(s) de
eventos
• Detecta padrões nas relações entre os eventos do(s) fluxo(s)
• ex: se as acções da Brisa subirem mais de 2% duas vezes, seguidas da descida
de 3% das da Galp Energia, então...
• Quando condição ESP/CEP então...
8. Processamento de eventos com Esper
2010/068/19
Esper / NEsper
• Motor de ESP/CEP
– Quando condição_Esper então o_código_java_habitual
– Tem um footprint pequeno
– É muito “ágil” tornando-se muito fácil de incluir no código existente
– É open source (também existe a versão enterprise)
– Junta o melhor dos dois mundos: ESP e CEP
• Informação sobre a framework
– A primeira release foi em Junho de 2006 (iniciou-se em Outubro de 2004)
– NEsper (versão para .NET) - igual à versão Java
– Versão Enterprise (cliente Web, monitorização de eventos, extensões JMX,
EsperJDBC, suporte técnico, etc)
9. Processamento de eventos com Esper
2010/069/19
Exemplos
• As “queries” e as condições são definidas com o recurso
a uma linguagem semelhante ao que estamos muito
habituados: SQL
– exemplos:
select * from Cotacao (valor > 13.4).win:length(5)
Selecciona os últimos 5 eventos do tipo “Cotacao” com valor > 13.4
insert into CotacoesImportantes select * from Cotacao where Math.ceil (valor) > 13.4
Insere numa tabela virtual todas as “Cotações” em que o valor seja superior a 13.4
select conta, nome_conta, sum(valor) from Cotacao.win:time_batch(10 sec) group by conta
Selecciona a soma dos valores das “Cotações”, agrupados por conta
10. Processamento de eventos com Esper
2010/0610/19
Criar Listeners (classe Listener)
import net.esper.client.*;
public class MyListener implements UpdateListener {
// método invocado pelo motor
public void update (EventBean[] newEvents,
EventBean[] oldEvents) {
// processamento do(s) evento(s)
}
}
11. Processamento de eventos com Esper
2010/0611/19
Registar Listeners
import net.esper.client.*;
// get da instância do motor
EPServiceProvider engine =
EPServiceProviderManager.getDefaultProvider();
// regista um statement
EPStatement statement = engine.getEPAdministrator().createEPL
(“sql_statement“, “nome_statement”);
// adiciona um listener
statement.addListener(new MyListener ());
12. Processamento de eventos com Esper
2010/0612/19
Registar eventos
import net.esper.client.*;
// get da instância do motor
EPServiceProvider engine =
EPServiceProviderManager.getDefaultProvider ();
// regista um statement
EPRuntime runTimeEngine = engine.getRuntime();
...
Cotacao evento = new Cotacao (12345, “conta_1”, 13.4);
runTimeEngine.sendEvent (evento);
...
13. Processamento de eventos com Esper
2010/0613/19
Potencialidades
// filtra por localização de um rectângulo
select * from EVT (x in [4:10], y in [6:12])
// conta todas a presenças na zona 10 nos últimos 30 segundos
select count(*) from EVT (zona = 10).win:time(30 sec)
// conta as presenças por zona nos últimos 10 minutos, a cada minuto
select zona, count(*) as cnt from EVT.std:groupby(zona).win:time(10 min) output every 1 min
// detecta quando ocorre uma entrada na zona 2 antes da zona 1
select Zona2.id
from EVT(zona = 2).win:time(1 day) Zona2
left outer join
EVT(zona = 1).win:time(1 day) Zona1
on Zona1.id = Zona2.id
where Zona1.id is null
• Filtrar eventos
• Janelas temporais
• Agregação e contagem temporal
• Joins
14. Processamento de eventos com Esper
2010/0614/19
Potencialidades
// alerta para quando for atingido o valor mínimo para uma zona
select zona, count(*)
from EVT.std:unique(id),
sql:db[select mini from Minimum where zone=${EVT.zona}]
having mini < count(*)
• Obtenção de dados históricos ou de referência
// detecta ids desconhecidos
select * from EVT
where id not in
(select id
from IdsConhecidos.std:unique(‘id’))
• Subqueries
15. Processamento de eventos com Esper
2010/0615/19
Especificações
• Tipos de eventos
– POJO
– Legacy Java
– Propriedades aninhadas (sem limite de profundidade), indexadas ou
mapeadas (E4X – ECMAScript for XML)
– XML/DOM + XPath
• Performance (anunciada)
– Mais de 500 000 eventos por segundo numa máquina com processador
Dual Core a 2GHz com 1000 condições registadas no motor
– Latência inferior e 3 microsegundos
– Evolução linear entre os 100 000 e os 500 000 eventos por segundo neste
hardware
16. Processamento de eventos com Esper
2010/0616/19
Sumário
• CEP/ESP
- Fluxos de dados avaliados contra as “queries” registadas despoletando
listeners
- Tempo e casualidade
• Vantagens
- EPL (Event Processing Language): tipo SQL e fácil de aprender
- Footprint pequeno
- Fácil de incluir em código existente
- Bem documentada
• EDA (Event Driven Application)
- Ajuda a resolver muitos dos problemas desta abordagem
- Tecnologia um pouco desconhecida, sendo pouco vista, mas com
maturidade suficiente para ser largamente utilizada
17. Processamento de eventos com Esper
2010/0617/19
Diagrama
Esper
OFFON
select ...select ...select ...
eventoeventoeventoeventoevento
match1match2
select ...
18. Processamento de eventos com Esper
2010/0618/19
Mais informação
• Esper - http://esper.codehaus.org
• EsperTech - http://www.espertech.com
• Portal CEP - http://complexevents.com
• Google