SlideShare une entreprise Scribd logo
1  sur  82
Télécharger pour lire hors ligne
Uma Linguagem para Processamento Distribuído de Eventos Complexos 
Juan Lopes 
24 de setembro de 2014
Quem sou eu? 
Não que credenciais importem muito, mas esse slide já é tradicional 
➔ Pai do Miguel 
➔ Bacharel em Ciência da Computação (UERJ) 
➔ Mestrando em Ciências Computacionais (UERJ) 
➔ Viciado em algoritmos e competições de programação 
➔ Programador na Intelie 
➔ {github.com,twitter.com}/juanplopes 
#qconrio pipes.intelie.com
Quem sou eu? 
Não que credenciais importem muito, mas esse slide já é tradicional 
➔ Pai do Miguel 
➔ Bacharel em Ciência da Computação (UERJ) 
➔ Mestrando em Ciências Computacionais (UERJ) 
➔ Viciado em algoritmos e competições de programação 
➔ Programador na Intelie 
➔ {github.com,twitter.com}/juanplopes 
➔ Aquele que separa vocês do happy hour. Foi mal. 
#qconrio pipes.intelie.com
QConSP 2013 
Estruturas de dados probabilísticas 
#qconrio pipes.intelie.com
QConSP 2013 
Estruturas de dados probabilísticas 
Slides 
juanlopes.net/qconsp2013 
Vídeo 
infoq.com/br/presentations/analisando-fluxo-dados-tempo-real 
#qconrio pipes.intelie.com
pipes.intelie.com 
Slides 
QConSP 2013 
Estruturas de dados probabilísticas 
juanlopes.net/qconsp2013 
Vídeo 
infoq.com/br/presentations/analisando-fluxo-dados-tempo-real 
Set membership 
Bloom Filters 
Burton H. Bloom (1970) 
#qconrio
Slides 
QConSP 2013 
Estruturas de dados probabilísticas 
juanlopes.net/qconsp2013 
Vídeo 
infoq.com/br/presentations/analisando-fluxo-dados-tempo-real 
Multiset sumarization 
Count-Min 
Graham Cormode, et al. (2003) 
Set membership 
Bloom Filters 
Burton H. Bloom (1970) 
#qconrio pipes.intelie.com
Slides 
QConSP 2013 
Estruturas de dados probabilísticas 
juanlopes.net/qconsp2013 
Vídeo 
infoq.com/br/presentations/analisando-fluxo-dados-tempo-real 
Multiset sumarization 
Count-Min 
Graham Cormode, et al. (2003) 
Set cardinality 
HyperLogLog 
Philippe Flajolet, et al. (2007) 
Set membership 
Bloom Filters 
Burton H. Bloom (1970) 
#qconrio pipes.intelie.com
Links 
Não precisa correr para anotar, esse slide irá voltar 
➔ Slides 
juanlopes.net/qconrio2014 
➔ Site e documentação 
pipes.intelie.com 
➔ Tutorial interativo 
pipes.intelie.com/tutorial 
#qconrio pipes.intelie.com
Agenda 
Porque ter uma agenda sempre dá uma boa impressão 
1 PROCESSAMENTO DE EVENTOS 101 
2 POR QUE MAIS UMA LINGUAGEM DE CEP? 
3 DETALHES DA LINGUAGEM 
4 DEMOS 
WHAT? 
WHY? 
HOW? 
WTF? 
pipes.intelie.com 
#qconrio
Agenda 
Porque ter uma agenda sempre dá uma boa impressão 
1 PROCESSAMENTO DE EVENTOS 101 
2 POR QUE MAIS UMA LINGUAGEM DE CEP? 
3 DETALHES DA LINGUAGEM 
4 DEMOS 
WHAT? 
WHY? 
HOW? 
WTF? 
pipes.intelie.com 
#qconrio
An event is a significant change of state at a 
particular point in time. 
#qconrio pipes.intelie.com
Eventos 
Onde? 
➔ Monitoração de infraestrutura 
➔ Análise de informações de negócio 
➔ Algorithmic trading 
➔ Bioinformática 
➔ Controle de tráfego urbano 
➔ Orquestração de software embarcardo 
➔ etc. 
#qconrio pipes.intelie.com
Eventos 
Onde? 
➔ Monitoração de infraestrutura 
➔ Análise de informações de negócio 
➔ Algorithmic trading 
➔ Bioinformática 
➔ Controle de tráfego urbano 
➔ Orquestração de software embarcardo 
➔ etc. 
#qconrio pipes.intelie.com
Eventos 
Onde? 
➔ Monitoração de infraestrutura 
➔ Análise de informações de negócio 
Não há ferramenta universal. 
Considerar: Latência × Flexibilidade × Desempenho 
#qconrio pipes.intelie.com
Eventos 
Sua infra está repleta deles 
#qconrio pipes.intelie.com
Eventos 
Sua infra está repleta deles 
logs 
métricas 
user analytics 
eventos de negócio 
auditoria 
#qconrio pipes.intelie.com
logs 
métricas 
user analytics 
eventos de negócio 
auditoria 
Eventos 
Sua infra está repleta deles 
? 
#qconrio pipes.intelie.com
Por que não SQL? 
Por que não! 
➔ Consultas contínuas 
➔ Primitivas temporais 
➔ Detecção de padrões 
➔ Janelas de eventos 
➔ Controle do output 
➔ Tudo em memória 
#qconrio pipes.intelie.com
Database Invertido 
O índice fica nas consultas 
modelo 
relacional 
resultado 
modelo baseado 
em eventos 
eventos 
resultados 
dados consultas 
consultas 
foco no passado 
consultas sem estado 
dados são o estado 
foco no presente 
consultas com estado 
dados sem estado 
#qconrio pipes.intelie.com
Ferramentas 
Tem muita gente fazendo isso 
#qconrio pipes.intelie.com
declare Sale 
@role( event ) 
end 
declare window Ticks 
Sale() over window:length(5) 
from entry-point MyEntryPoint 
end 
rule "More than 2 sale suceess in 5 events" 
when 
Number($cnt : intValue,intValue > 2) from accumulate( 
Sale (saleHappened == "Y") from window Ticks, count(1) 
) 
then 
System.out.println( 
"A sale has happened over " + $cnt +" events" ); 
end 
var forward = inputStream.AlterEventStartTime( 
s => s.StartTime.AddSeconds(1)); 
var query = from evt in inputStream 
from prev in forward 
where prev.Value < threshold && 
evt.Value > threshold 
select new 
{ 
Time = evt.Time, 
Low = prev.Value, 
High = evt.Value 
}; 
#qconrio pipes.intelie.com
SELECT 
count(*) as fails, 
timestamp, 
local, 
description, 
FROM 
HttpMonitor(type = "error" OR 
description ="Timeout::Error") 
.std:groupwin(description) 
.win:time(15 minutes) 
SELECT T.firstc, T.lastc, T.Ac1, T.Bc1, T.avgCc1, T.Dc1 
FROM 
S0 
MATCH_RECOGNIZE ( 
MEASURES 
first(C.c2) as firstc, 
last(C.c2) as lastc, 
avg(C.c1) as avgCc1, 
A.c1 as Ac1, 
B.c1 as Bc1, 
D.c1 as Dc1 
PATTERN(A B C* D) 
DEFINE 
A as A.c1 = 30, 
B as B.c2 = 10.0, 
C as C.c1 = 7, 
D as D.c1 = 40 
) as T 
#qconrio pipes.intelie.com
SELECT STREAM 
"SuspectLoginFailures"."accountNumber", 
"loginFailureCount", 
"transactionType", 
"amount" 
FROM "SuspectLoginFailures" OVER "lastFew" 
JOIN "Transactions" OVER "lastFew" 
ON "SuspectLoginFailures"."accountNumber" = 
"Transactions"."accountNumber" 
WHERE ("transactionType" = 'isDebit') 
WINDOW "lastFew" AS (RANGE INTERVAL '1' MINUTE 
PRECEDING); 
CREATE OUTPUT STREAM TickStats AS 
SELECT openval() AS StartOfTimeSlice, 
avg(NumberTicks) AS AvgTicksPerSecond, 
stdev(NumberTicks) AS StdevTicksPerSecond, 
lastval(NumberTicks) AS LastTicksPerSecond, 
FeedName 
FROM TicksPerSecond [ 
SIZE 20 ADVANCE 1 ON StartOfTimeSlice 
PARTITION BY FeedName 
] 
GROUP BY FeedName; 
#qconrio pipes.intelie.com
#qconrio pipes.intelie.com
Nomenclatura 
Um pouco de bikeshedding não faz mal a ninguém 
➔ ECA (Event–Condition–Action) 
➔ ESP (Event Stream Processing) 
➔ CEP (Complex Event Processing) 
#qconrio pipes.intelie.com
Nomenclatura 
Um pouco de bikeshedding não faz mal a ninguém 
➔ ECA (Event–Condition–Action) 
➔ ESP (Event Stream Processing) 
➔ CEP (Complex Event Processing) 
#qconrio pipes.intelie.com
Nomenclatura 
Para falar a verdade, não há tanto consenso 
CEP 
ESP 
alto desempenho 
agregações complexas 
causalidade 
inferências complexas 
#qconrio pipes.intelie.com
Nomenclatura 
Para falar a verdade, não há tanto consenso 
detection-oriented 
CEP 
aggregation-oriented 
CEP 
#qconrio pipes.intelie.com
Nomenclatura 
Para falar a verdade, não há tanto consenso 
detection-oriented 
CEP 
aggregation-oriented 
CEP 
#qconrio pipes.intelie.com
Agregações 
No passado é simples 
select count(*) from stream 
EPL 
pipes.intelie.com 
#qconrio
Agregações 
No passado é simples, mas e em tempo real? 
select count(*) from stream 
EPL 
pipes.intelie.com 
public class AggregatorCount implements AggregationMethod 
{ 
protected long numDataPoints; 
public void clear() { 
numDataPoints = 0; 
} 
public void enter(Object object) { 
numDataPoints++; 
} 
public void leave(Object object) { 
numDataPoints--; 
} 
public Object getValue() { 
return numDataPoints; 
} 
} 
#qconrio 
JAVA
public void leave(Object object) 
{ 
numDataPoints--; 
sum -= ((Number) object).doubleValue(); 
} 
public Object getValue() 
{ 
if (numDataPoints == 0) 
return null; 
return sum / numDataPoints; 
} 
Agregações 
No passado é simples, mas e em tempo real? 
} 
select avg(field) from stream 
EPL 
pipes.intelie.com 
public class AggregatorAvg implements AggregationMethod 
{ 
protected double sum; 
protected long numDataPoints; 
public void clear() 
{ 
sum = 0; 
numDataPoints = 0; 
} 
public void enter(Object object) 
{ 
numDataPoints++; 
sum += ((Number) object).doubleValue(); 
} 
#qconrio 
JAVA
Enter, leave? 
A lógica em agregações sobre eventos é um pouco diferente 
count(*) == 6 
1 minute 
select count(*) 
from stream.win:time(1 minute) 
EPL 
pipes.intelie.com 
#qconrio 
tempo
Enter, leave? 
A lógica em agregações sobre eventos é um pouco diferente 
count(*) == 5 
1 minute 
select count(*) 
from stream.win:time(1 minute) 
EPL 
pipes.intelie.com 
#qconrio 
tempo 
leave enter
Janelas de eventos 
Definem o conjunto de eventos sobre os quais a agregação irá executar 
➔ Agregações não precisam recalcular novos eventos 
➔ Algoritmos online são essenciais 
➔ Estabilidade numérica é importante; exemplo ruim: 
public class AggregatorAvg implements AggregationMethod 
{ 
//... 
public Object getValue() 
{ 
if (numDataPoints == 0) 
return null; 
return sum / numDataPoints; 
} 
//... 
} 
JAVA 
#qconrio pipes.intelie.com
Janelas de eventos 
Definem o conjunto de eventos sobre os quais a agregação irá executar 
➔ Agregações não precisam recalcular novos eventos 
➔ Algoritmos online são essenciais 
➔ Estabilidade numérica é importante; exemplo bom: 
#qconrio pipes.intelie.com
Janelas de tempo 
Difícil prever custo de memória 
select count(*) 
from stream.win:time(1 day) 
output last every 1 second 
EPL 
pipes.intelie.com 
#qconrio
Janelas de tempo 
Difícil prever custo de memória 
select count(*) 
from stream.win:time(1 day) 
output last every 1 second 
EPL 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
pipes.intelie.com 
Bilhões de eventos por dia? OOM na certa. 
#qconrio
Agenda 
Porque ter uma agenda sempre dá uma boa impressão 
1 PROCESSAMENTO DE EVENTOS 101 
2 POR QUE MAIS UMA LINGUAGEM DE CEP? 
3 DETALHES DA LINGUAGEM 
4 DEMOS 
WHAT? 
WHY? 
HOW? 
WTF? 
pipes.intelie.com 
#qconrio
#qconrio pipes.intelie.com
➔ Usado na Globo.com 
➔ Processa bilhões de linhas de log por dia 
➔ Índice full-text com Lucene modificado 
➔ Sistema completamente distribuído 
Como processar esses logs em tempo real? 
#qconrio pipes.intelie.com
#qconrio pipes.intelie.com
➔ Usado na Globo.com e Walmart.com 
➔ Processa tanto eventos de infra quanto de negócio 
➔ Permite criar dashboards, alertas, relatórios, etc. 
➔ Processa centenas de eventos/segundo tranquilamente 
➔ Usa Esper como um dos motores de regras 
Como escalar? 
#qconrio pipes.intelie.com
cluster 
LOGS 
e outros eventos 
? 
reports 
graphs 
alerts 
#qconrio pipes.intelie.com
cluster 
LOGS 
e outros eventos 
reports 
graphs 
alerts 
#qconrio pipes.intelie.com
Objetivos primários 
Não dava para simplesmente jogar o Esper aí 
➔ Processar bilhões de eventos por dia (até 300 mil/s) 
➔ Suportar milhares de queries simultâneas 
➔ Permitir processamento distribuído! 
➔ Não onerar a rede excessivamente 
➔ Baixo consumo de memória 
➔ Em apenas uma passagem pelos dados 
#qconrio pipes.intelie.com
Objetivos secundários 
Já que vamos criar uma linguagem nova... 
➔ Filtros baseados na sintaxe do Lucene 
➔ Poder escrever consultas em apenas uma linha 
➔ Design monádico (esqueça SQL) 
➔ Mesmo permitindo processamento distribuído, também 
fornecer ferramentas para single-node 
➔ Custo de memória o mais previsível possível 
#qconrio pipes.intelie.com
Agenda 
Porque ter uma agenda sempre dá uma boa impressão 
1 PROCESSAMENTO DE EVENTOS 101 
2 POR QUE MAIS UMA LINGUAGEM DE CEP? 
3 DETALHES DA LINGUAGEM 
4 DEMOS 
WHAT? 
WHY? 
HOW? 
WTF? 
pipes.intelie.com 
#qconrio
Links 
Eu disse que voltaria; no final ele aparece de novo 
➔ Slides 
juanlopes.net/qconrio2014 
➔ Site e documentação 
pipes.intelie.com 
➔ Tutorial interativo 
pipes.intelie.com/tutorial 
#qconrio pipes.intelie.com
Exemplo motivador 
O mínimo que precisava ser feito 
field:value => count() every minute 
PIPES 
pipes.intelie.com 
filtro agregação 
#qconrio
Filtros 
Já que Lucene não tem real-time, implementamos o nosso 
type:http status:404 
PIPES 
pipes.intelie.com 
#qconrio
Filtros 
Já que Lucene não tem real-time, implementamos o nosso 
type:http status:404 
PIPES 
type:http status:200 PIPES 
type:http status:(2?? | 3??) PIPES 
pipes.intelie.com 
#qconrio
Filtros 
Já que Lucene não tem real-time, implementamos o nosso 
type:http status:404 
PIPES 
type:http status:200 PIPES 
type:http status:(2?? | 3??) PIPES 
pipes.intelie.com 
#qconrio
Filtros 
Já que Lucene não tem real-time, implementamos o nosso 
type:http status:404 
PIPES 
type:http status:200 PIPES 
type:http status:(2?? | 3??) PIPES 
pipes.intelie.com 
#qconrio
Autômatos de filtro 
Minimizam o consumo de CPU dos filtros 
00 
?? 
field: type 
field: status 
http 
2 
404 
3 
?? 
and 
and 
or and 
type:http status:404 
type:http status:200 
type:http status:(2?? | 3??) 
#qconrio pipes.intelie.com
Autômatos na unha 
Regex match em Java é NP-difícil (em Ruby, Python, Perl etc. também) 
github.com/juanplopes/pyrex 
#qconrio pipes.intelie.com
Autômatos na unha 
Em alguns casos regex nem ajudaria tanto 
text:food~2 PIPES 
blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata 
#qconrio pipes.intelie.com
Tipos de filtro implementados 
Nem todos os tipos de filtro do Lucene foram implementados 
➔ Match all: 
* 
➔ Term: 
<field>:<term> 
➔ Range: 
<field>:[<lower>, <upper>] 
➔ Fuzzy: 
<field>:<term>~<number> 
➔ AND: 
<filter> & <filter> 
➔ OR: 
<filter> | <filter> 
➔ NOT: 
-<filter> 
#qconrio pipes.intelie.com
Composição de filtros 
Um pouco mais poderosa até que a do Lucene 
WebAccess PIPES 
#qconrio pipes.intelie.com
Composição de filtros 
Um pouco mais poderosa até que a do Lucene 
WebAccess PIPES 
WebAccess browser:firefox PIPES 
#qconrio pipes.intelie.com
Composição de filtros 
Um pouco mais poderosa até que a do Lucene 
WebAccess PIPES 
WebAccess browser:firefox PIPES 
WebAccess browser:(firefox|chrome) PIPES 
#qconrio pipes.intelie.com
Composição de filtros 
Um pouco mais poderosa até que a do Lucene 
WebAccess PIPES 
WebAccess browser:firefox PIPES 
WebAccess browser:(firefox|chrome) PIPES 
WebAccess browser:(firefox|chrome|(IE* product_id#:[15, 60])) PIPES 
#qconrio pipes.intelie.com
Filtros 
Um pequeno resumo 
➔ Filtros não sabem dizer se um evento dá match ou não 
➔ Apenas sabem criar o autômato que reconhece um valor 
➔ Registrar um filtro significa adicionar ao autômato 
transições que reconheçam o valor e listeners para 
estados de aceite 
➔ Os eventos são submetidos aos autômatos (um para cada 
campo) e os matchs são notificados e encadeados 
➔ Código complexo (e com alta cobertura) 
#qconrio pipes.intelie.com
Filtros 
Um pequeno resumo 
00 
?? 
field: type 
field: status 
http 
2 
404 
3 
?? 
and 
and 
or and 
type:http status:404 
type:http status:200 
type:http status:(2?? | 3??) 
#qconrio pipes.intelie.com
Tipagem estática, mas sem schema 
O máximo para evitar problemas 
➔ A linguagem não assume nada sobre o tipo dos fluxos 
➔ Tipos são codificados na consulta, não em um schema 
externo 
➔ Existe apenas um fluxo global e filtros sobre ele 
➔ Somente 8 tipos são tratados pela linguagem 
#qconrio pipes.intelie.com
Agregações 
Uma abordagem bem diferente do tradicional 
* => count() every minute 
PIPES 
pipes.intelie.com 
#qconrio 
count: 123 
count: 456 
count: 579
Agregações 
Uma abordagem bem diferente do tradicional 
* => avg(field#) every minute 
PIPES 
pipes.intelie.com 
#qconrio 
mean: 237.44 
sumw: 205 
mean: 1061.08 
sumw: 57 
mean: 416.63 
sumw: 262
Agregações 
Cada agregação tem uma representação intermediária 
* => avg(response_time#):describe at the end 
> {"sumw":2125.0,"mean":2.420657513400854} 
MIXED 
* => (variance(response_time#)*count()):describe at the end 
> {"trees":[{"sumw":2125.0,"mean":2.420657513400854,"m2":3582.7099512146638},{"value":3481}]} 
MIXED 
pipes.intelie.com 
#qconrio 
MIXED 
* => median(response_time#):describe at the end 
> {"sketch":{"e":4.147768903288338E-5,"width":65536,"M":[...],"mask":65535,"total":2125.0}}
Agregações 
Toda agregação precisa implementar três conceitos 
public interface Aggregation<T> extends Expression<T> { 
State newState(int flips); 
Merger newMerger(); 
T eval(Tree tree, WindowBounds bounds); 
} 
public interface State { 
void yield(Object obj); 
Tree flip(); 
} 
public interface Merger { 
void add(Tree tree); 
void remove(Tree tree); 
void clear(); 
Tree get(); 
} 
JAVA 
#qconrio pipes.intelie.com
Agregações 
Toda agregação precisa implementar três conceitos 
intermediate 
representation 
aggregation 
window or reducer 
merger 
tree 
event state 
reducer 
evaluator result 
#qconrio pipes.intelie.com
* => count() over last 5 minutes every minute 
count() == 16 
5 minutes 
PIPES 
pipes.intelie.com 
#qconrio 
tempo 
Janelas de eventos 
Usam o mesmo mecanismo para mesclar resultados
Janelas de eventos 
Usam o mesmo mecanismo para mesclar resultados 
* => count() over last 5 minutes every minute 
count() == 16 
3 4 2 2 5 4 2 3 
5 minutes 
PIPES 
pipes.intelie.com 
#qconrio 
tempo
Janelas de eventos 
Usam o mesmo mecanismo para mesclar resultados 
➔ Vantagens 
◆ Quantidade de memória previsível em compile-time 
◆ Permite janelas muito maiores (mês, ano, etc.) 
➔ Desvantagens 
◆ Output precisa ser compatível com janela 
◆ Janela precisa ter tamanho múltiplo do output 
#qconrio pipes.intelie.com
Por que o nome é Pipes? 
Unix pipelines 
curl http://example.com | grep somestring | wc -l | xargs echo ‘Result:’ SHELL 
curl grep wc xargs 
#qconrio pipes.intelie.com
Encadeamento de queries 
A saída de uma torna-se a entrada de outra 
WebAccess 
=> count() by host over last 2 hours every 5 minutes 
=> @sort _ desc 
PIPES 
pipes.intelie.com 
#qconrio 
filter count sort
Encadeamento de queries 
A saída de uma torna-se a entrada de outra 
Metric|WebAccess 
=> [ 
@filter Metric kind:memory => avg(value#):bytes as mem by host every hour 
join on host 
@filter Metric kind:'cpu load' => avg(value#):format('0%') as cpu by host every hour 
join on host 
@filter WebAccess => count() as requests by host every hour 
] 
=> @sort requests desc 
PIPES 
pipes.intelie.com 
#qconrio 
filter 
filter 
avg 
filter sort 
filter 
avg 
count
Encadeamento de queries 
A saída de uma torna-se a entrada de outra 
single machine 
filter safe semi-safe safe unsafe 
reducer machine 
mapper machine (1) 
filter safe 
semi-safe 
mapper 
unsafe 
semi-safe 
reducer 
mapper machine (2) 
filter safe 
semi-safe 
mapper 
safe 
#qconrio pipes.intelie.com
Testes, testes e mais testes 
Isso não deveria ser mais novidade 
➔ 17K functional SLOC 
➔ 21K test SLOC 
➔ 11K generated SLOC 
➔ 2260 test cases 
➔ 100% line coverage 
➔ 96% branch coverage 
#qconrio pipes.intelie.com
Agenda 
Porque ter uma agenda sempre dá uma boa impressão 
1 PROCESSAMENTO DE EVENTOS 101 
2 POR QUE MAIS UMA LINGUAGEM DE CEP? 
3 DETALHES DA LINGUAGEM 
4 DEMOS 
WHAT? 
WHY? 
HOW? 
WTF? 
pipes.intelie.com 
#qconrio
Links 
Agora pode anotar 
➔ Slides 
juanlopes.net/qconrio2014 
➔ Site e documentação 
pipes.intelie.com 
➔ Tutorial interativo 
pipes.intelie.com/tutorial 
#qconrio pipes.intelie.com
Obrigado! 
@juanplopes 
#qconrio pipes.intelie.com

Contenu connexe

Similaire à Linguagem para Processamento de Eventos Complexos

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Rogério Moraes de Carvalho
 
O que você precisa saber sobre testes unitários
O que você precisa saber sobre testes unitáriosO que você precisa saber sobre testes unitários
O que você precisa saber sobre testes unitáriosFilipe M. Silva
 
Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Embarcados
 
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Rodrigo Senra
 
TDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e featureTDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e featuretdc-globalcode
 
Tutorial sobre Jquery
Tutorial sobre JqueryTutorial sobre Jquery
Tutorial sobre JqueryIvo Calado
 
TDC - Testes e Sistemas legados #quemNunca - SC/2016
TDC - Testes e Sistemas legados #quemNunca - SC/2016TDC - Testes e Sistemas legados #quemNunca - SC/2016
TDC - Testes e Sistemas legados #quemNunca - SC/2016Fernando Santiago
 
Testes em todos os niveis de planejamento
Testes em todos os niveis de planejamentoTestes em todos os niveis de planejamento
Testes em todos os niveis de planejamentoElias Nogueira
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na PráticaEiti Kimura
 
Padrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega ContínuaPadrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega ContínuaDanilo Sato
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Práticatdc-globalcode
 
Funcionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasFuncionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasKirmayr tomaz
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Do código à produção com Gitlab (mundo python)
Do código à produção com Gitlab (mundo python)Do código à produção com Gitlab (mundo python)
Do código à produção com Gitlab (mundo python)Better Developer
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPaulino Michelazzo
 
Stream Processing - ThoughtWorks Architecture Group - 2017
Stream Processing - ThoughtWorks Architecture Group - 2017Stream Processing - ThoughtWorks Architecture Group - 2017
Stream Processing - ThoughtWorks Architecture Group - 2017Otávio Carvalho
 

Similaire à Linguagem para Processamento de Eventos Complexos (20)

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Divida tecnica
Divida tecnicaDivida tecnica
Divida tecnica
 
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
 
O que você precisa saber sobre testes unitários
O que você precisa saber sobre testes unitáriosO que você precisa saber sobre testes unitários
O que você precisa saber sobre testes unitários
 
Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?
 
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
 
TDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e featureTDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e feature
 
Tutorial sobre Jquery
Tutorial sobre JqueryTutorial sobre Jquery
Tutorial sobre Jquery
 
TDC - Testes e Sistemas legados #quemNunca - SC/2016
TDC - Testes e Sistemas legados #quemNunca - SC/2016TDC - Testes e Sistemas legados #quemNunca - SC/2016
TDC - Testes e Sistemas legados #quemNunca - SC/2016
 
Testes em todos os niveis de planejamento
Testes em todos os niveis de planejamentoTestes em todos os niveis de planejamento
Testes em todos os niveis de planejamento
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
 
Padrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega ContínuaPadrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega Contínua
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Prática
 
Funcionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasFuncionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticas
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Event sourcing
Event sourcingEvent sourcing
Event sourcing
 
Do código à produção com Gitlab (mundo python)
Do código à produção com Gitlab (mundo python)Do código à produção com Gitlab (mundo python)
Do código à produção com Gitlab (mundo python)
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
 
Stream Processing - ThoughtWorks Architecture Group - 2017
Stream Processing - ThoughtWorks Architecture Group - 2017Stream Processing - ThoughtWorks Architecture Group - 2017
Stream Processing - ThoughtWorks Architecture Group - 2017
 

Plus de Juan Lopes

Plus de Juan Lopes (10)

qconrio2015
qconrio2015qconrio2015
qconrio2015
 
qconsp2015
qconsp2015qconsp2015
qconsp2015
 
devday2013
devday2013devday2013
devday2013
 
dnarj20130504
dnarj20130504dnarj20130504
dnarj20130504
 
uerj201212
uerj201212uerj201212
uerj201212
 
devday2012
devday2012devday2012
devday2012
 
rioinfo2012
rioinfo2012rioinfo2012
rioinfo2012
 
tdc2012
tdc2012tdc2012
tdc2012
 
dnarj-20120630
dnarj-20120630dnarj-20120630
dnarj-20120630
 
dnad12
dnad12dnad12
dnad12
 

Linguagem para Processamento de Eventos Complexos

  • 1. Uma Linguagem para Processamento Distribuído de Eventos Complexos Juan Lopes 24 de setembro de 2014
  • 2. Quem sou eu? Não que credenciais importem muito, mas esse slide já é tradicional ➔ Pai do Miguel ➔ Bacharel em Ciência da Computação (UERJ) ➔ Mestrando em Ciências Computacionais (UERJ) ➔ Viciado em algoritmos e competições de programação ➔ Programador na Intelie ➔ {github.com,twitter.com}/juanplopes #qconrio pipes.intelie.com
  • 3. Quem sou eu? Não que credenciais importem muito, mas esse slide já é tradicional ➔ Pai do Miguel ➔ Bacharel em Ciência da Computação (UERJ) ➔ Mestrando em Ciências Computacionais (UERJ) ➔ Viciado em algoritmos e competições de programação ➔ Programador na Intelie ➔ {github.com,twitter.com}/juanplopes ➔ Aquele que separa vocês do happy hour. Foi mal. #qconrio pipes.intelie.com
  • 4. QConSP 2013 Estruturas de dados probabilísticas #qconrio pipes.intelie.com
  • 5. QConSP 2013 Estruturas de dados probabilísticas Slides juanlopes.net/qconsp2013 Vídeo infoq.com/br/presentations/analisando-fluxo-dados-tempo-real #qconrio pipes.intelie.com
  • 6. pipes.intelie.com Slides QConSP 2013 Estruturas de dados probabilísticas juanlopes.net/qconsp2013 Vídeo infoq.com/br/presentations/analisando-fluxo-dados-tempo-real Set membership Bloom Filters Burton H. Bloom (1970) #qconrio
  • 7. Slides QConSP 2013 Estruturas de dados probabilísticas juanlopes.net/qconsp2013 Vídeo infoq.com/br/presentations/analisando-fluxo-dados-tempo-real Multiset sumarization Count-Min Graham Cormode, et al. (2003) Set membership Bloom Filters Burton H. Bloom (1970) #qconrio pipes.intelie.com
  • 8. Slides QConSP 2013 Estruturas de dados probabilísticas juanlopes.net/qconsp2013 Vídeo infoq.com/br/presentations/analisando-fluxo-dados-tempo-real Multiset sumarization Count-Min Graham Cormode, et al. (2003) Set cardinality HyperLogLog Philippe Flajolet, et al. (2007) Set membership Bloom Filters Burton H. Bloom (1970) #qconrio pipes.intelie.com
  • 9. Links Não precisa correr para anotar, esse slide irá voltar ➔ Slides juanlopes.net/qconrio2014 ➔ Site e documentação pipes.intelie.com ➔ Tutorial interativo pipes.intelie.com/tutorial #qconrio pipes.intelie.com
  • 10. Agenda Porque ter uma agenda sempre dá uma boa impressão 1 PROCESSAMENTO DE EVENTOS 101 2 POR QUE MAIS UMA LINGUAGEM DE CEP? 3 DETALHES DA LINGUAGEM 4 DEMOS WHAT? WHY? HOW? WTF? pipes.intelie.com #qconrio
  • 11. Agenda Porque ter uma agenda sempre dá uma boa impressão 1 PROCESSAMENTO DE EVENTOS 101 2 POR QUE MAIS UMA LINGUAGEM DE CEP? 3 DETALHES DA LINGUAGEM 4 DEMOS WHAT? WHY? HOW? WTF? pipes.intelie.com #qconrio
  • 12. An event is a significant change of state at a particular point in time. #qconrio pipes.intelie.com
  • 13. Eventos Onde? ➔ Monitoração de infraestrutura ➔ Análise de informações de negócio ➔ Algorithmic trading ➔ Bioinformática ➔ Controle de tráfego urbano ➔ Orquestração de software embarcardo ➔ etc. #qconrio pipes.intelie.com
  • 14. Eventos Onde? ➔ Monitoração de infraestrutura ➔ Análise de informações de negócio ➔ Algorithmic trading ➔ Bioinformática ➔ Controle de tráfego urbano ➔ Orquestração de software embarcardo ➔ etc. #qconrio pipes.intelie.com
  • 15. Eventos Onde? ➔ Monitoração de infraestrutura ➔ Análise de informações de negócio Não há ferramenta universal. Considerar: Latência × Flexibilidade × Desempenho #qconrio pipes.intelie.com
  • 16. Eventos Sua infra está repleta deles #qconrio pipes.intelie.com
  • 17. Eventos Sua infra está repleta deles logs métricas user analytics eventos de negócio auditoria #qconrio pipes.intelie.com
  • 18. logs métricas user analytics eventos de negócio auditoria Eventos Sua infra está repleta deles ? #qconrio pipes.intelie.com
  • 19. Por que não SQL? Por que não! ➔ Consultas contínuas ➔ Primitivas temporais ➔ Detecção de padrões ➔ Janelas de eventos ➔ Controle do output ➔ Tudo em memória #qconrio pipes.intelie.com
  • 20. Database Invertido O índice fica nas consultas modelo relacional resultado modelo baseado em eventos eventos resultados dados consultas consultas foco no passado consultas sem estado dados são o estado foco no presente consultas com estado dados sem estado #qconrio pipes.intelie.com
  • 21. Ferramentas Tem muita gente fazendo isso #qconrio pipes.intelie.com
  • 22. declare Sale @role( event ) end declare window Ticks Sale() over window:length(5) from entry-point MyEntryPoint end rule "More than 2 sale suceess in 5 events" when Number($cnt : intValue,intValue > 2) from accumulate( Sale (saleHappened == "Y") from window Ticks, count(1) ) then System.out.println( "A sale has happened over " + $cnt +" events" ); end var forward = inputStream.AlterEventStartTime( s => s.StartTime.AddSeconds(1)); var query = from evt in inputStream from prev in forward where prev.Value < threshold && evt.Value > threshold select new { Time = evt.Time, Low = prev.Value, High = evt.Value }; #qconrio pipes.intelie.com
  • 23. SELECT count(*) as fails, timestamp, local, description, FROM HttpMonitor(type = "error" OR description ="Timeout::Error") .std:groupwin(description) .win:time(15 minutes) SELECT T.firstc, T.lastc, T.Ac1, T.Bc1, T.avgCc1, T.Dc1 FROM S0 MATCH_RECOGNIZE ( MEASURES first(C.c2) as firstc, last(C.c2) as lastc, avg(C.c1) as avgCc1, A.c1 as Ac1, B.c1 as Bc1, D.c1 as Dc1 PATTERN(A B C* D) DEFINE A as A.c1 = 30, B as B.c2 = 10.0, C as C.c1 = 7, D as D.c1 = 40 ) as T #qconrio pipes.intelie.com
  • 24. SELECT STREAM "SuspectLoginFailures"."accountNumber", "loginFailureCount", "transactionType", "amount" FROM "SuspectLoginFailures" OVER "lastFew" JOIN "Transactions" OVER "lastFew" ON "SuspectLoginFailures"."accountNumber" = "Transactions"."accountNumber" WHERE ("transactionType" = 'isDebit') WINDOW "lastFew" AS (RANGE INTERVAL '1' MINUTE PRECEDING); CREATE OUTPUT STREAM TickStats AS SELECT openval() AS StartOfTimeSlice, avg(NumberTicks) AS AvgTicksPerSecond, stdev(NumberTicks) AS StdevTicksPerSecond, lastval(NumberTicks) AS LastTicksPerSecond, FeedName FROM TicksPerSecond [ SIZE 20 ADVANCE 1 ON StartOfTimeSlice PARTITION BY FeedName ] GROUP BY FeedName; #qconrio pipes.intelie.com
  • 26. Nomenclatura Um pouco de bikeshedding não faz mal a ninguém ➔ ECA (Event–Condition–Action) ➔ ESP (Event Stream Processing) ➔ CEP (Complex Event Processing) #qconrio pipes.intelie.com
  • 27. Nomenclatura Um pouco de bikeshedding não faz mal a ninguém ➔ ECA (Event–Condition–Action) ➔ ESP (Event Stream Processing) ➔ CEP (Complex Event Processing) #qconrio pipes.intelie.com
  • 28. Nomenclatura Para falar a verdade, não há tanto consenso CEP ESP alto desempenho agregações complexas causalidade inferências complexas #qconrio pipes.intelie.com
  • 29. Nomenclatura Para falar a verdade, não há tanto consenso detection-oriented CEP aggregation-oriented CEP #qconrio pipes.intelie.com
  • 30. Nomenclatura Para falar a verdade, não há tanto consenso detection-oriented CEP aggregation-oriented CEP #qconrio pipes.intelie.com
  • 31. Agregações No passado é simples select count(*) from stream EPL pipes.intelie.com #qconrio
  • 32. Agregações No passado é simples, mas e em tempo real? select count(*) from stream EPL pipes.intelie.com public class AggregatorCount implements AggregationMethod { protected long numDataPoints; public void clear() { numDataPoints = 0; } public void enter(Object object) { numDataPoints++; } public void leave(Object object) { numDataPoints--; } public Object getValue() { return numDataPoints; } } #qconrio JAVA
  • 33. public void leave(Object object) { numDataPoints--; sum -= ((Number) object).doubleValue(); } public Object getValue() { if (numDataPoints == 0) return null; return sum / numDataPoints; } Agregações No passado é simples, mas e em tempo real? } select avg(field) from stream EPL pipes.intelie.com public class AggregatorAvg implements AggregationMethod { protected double sum; protected long numDataPoints; public void clear() { sum = 0; numDataPoints = 0; } public void enter(Object object) { numDataPoints++; sum += ((Number) object).doubleValue(); } #qconrio JAVA
  • 34. Enter, leave? A lógica em agregações sobre eventos é um pouco diferente count(*) == 6 1 minute select count(*) from stream.win:time(1 minute) EPL pipes.intelie.com #qconrio tempo
  • 35. Enter, leave? A lógica em agregações sobre eventos é um pouco diferente count(*) == 5 1 minute select count(*) from stream.win:time(1 minute) EPL pipes.intelie.com #qconrio tempo leave enter
  • 36. Janelas de eventos Definem o conjunto de eventos sobre os quais a agregação irá executar ➔ Agregações não precisam recalcular novos eventos ➔ Algoritmos online são essenciais ➔ Estabilidade numérica é importante; exemplo ruim: public class AggregatorAvg implements AggregationMethod { //... public Object getValue() { if (numDataPoints == 0) return null; return sum / numDataPoints; } //... } JAVA #qconrio pipes.intelie.com
  • 37. Janelas de eventos Definem o conjunto de eventos sobre os quais a agregação irá executar ➔ Agregações não precisam recalcular novos eventos ➔ Algoritmos online são essenciais ➔ Estabilidade numérica é importante; exemplo bom: #qconrio pipes.intelie.com
  • 38. Janelas de tempo Difícil prever custo de memória select count(*) from stream.win:time(1 day) output last every 1 second EPL pipes.intelie.com #qconrio
  • 39. Janelas de tempo Difícil prever custo de memória select count(*) from stream.win:time(1 day) output last every 1 second EPL java.lang.OutOfMemoryError: GC overhead limit exceeded pipes.intelie.com Bilhões de eventos por dia? OOM na certa. #qconrio
  • 40. Agenda Porque ter uma agenda sempre dá uma boa impressão 1 PROCESSAMENTO DE EVENTOS 101 2 POR QUE MAIS UMA LINGUAGEM DE CEP? 3 DETALHES DA LINGUAGEM 4 DEMOS WHAT? WHY? HOW? WTF? pipes.intelie.com #qconrio
  • 42. ➔ Usado na Globo.com ➔ Processa bilhões de linhas de log por dia ➔ Índice full-text com Lucene modificado ➔ Sistema completamente distribuído Como processar esses logs em tempo real? #qconrio pipes.intelie.com
  • 44. ➔ Usado na Globo.com e Walmart.com ➔ Processa tanto eventos de infra quanto de negócio ➔ Permite criar dashboards, alertas, relatórios, etc. ➔ Processa centenas de eventos/segundo tranquilamente ➔ Usa Esper como um dos motores de regras Como escalar? #qconrio pipes.intelie.com
  • 45. cluster LOGS e outros eventos ? reports graphs alerts #qconrio pipes.intelie.com
  • 46. cluster LOGS e outros eventos reports graphs alerts #qconrio pipes.intelie.com
  • 47. Objetivos primários Não dava para simplesmente jogar o Esper aí ➔ Processar bilhões de eventos por dia (até 300 mil/s) ➔ Suportar milhares de queries simultâneas ➔ Permitir processamento distribuído! ➔ Não onerar a rede excessivamente ➔ Baixo consumo de memória ➔ Em apenas uma passagem pelos dados #qconrio pipes.intelie.com
  • 48. Objetivos secundários Já que vamos criar uma linguagem nova... ➔ Filtros baseados na sintaxe do Lucene ➔ Poder escrever consultas em apenas uma linha ➔ Design monádico (esqueça SQL) ➔ Mesmo permitindo processamento distribuído, também fornecer ferramentas para single-node ➔ Custo de memória o mais previsível possível #qconrio pipes.intelie.com
  • 49. Agenda Porque ter uma agenda sempre dá uma boa impressão 1 PROCESSAMENTO DE EVENTOS 101 2 POR QUE MAIS UMA LINGUAGEM DE CEP? 3 DETALHES DA LINGUAGEM 4 DEMOS WHAT? WHY? HOW? WTF? pipes.intelie.com #qconrio
  • 50. Links Eu disse que voltaria; no final ele aparece de novo ➔ Slides juanlopes.net/qconrio2014 ➔ Site e documentação pipes.intelie.com ➔ Tutorial interativo pipes.intelie.com/tutorial #qconrio pipes.intelie.com
  • 51. Exemplo motivador O mínimo que precisava ser feito field:value => count() every minute PIPES pipes.intelie.com filtro agregação #qconrio
  • 52. Filtros Já que Lucene não tem real-time, implementamos o nosso type:http status:404 PIPES pipes.intelie.com #qconrio
  • 53. Filtros Já que Lucene não tem real-time, implementamos o nosso type:http status:404 PIPES type:http status:200 PIPES type:http status:(2?? | 3??) PIPES pipes.intelie.com #qconrio
  • 54. Filtros Já que Lucene não tem real-time, implementamos o nosso type:http status:404 PIPES type:http status:200 PIPES type:http status:(2?? | 3??) PIPES pipes.intelie.com #qconrio
  • 55. Filtros Já que Lucene não tem real-time, implementamos o nosso type:http status:404 PIPES type:http status:200 PIPES type:http status:(2?? | 3??) PIPES pipes.intelie.com #qconrio
  • 56. Autômatos de filtro Minimizam o consumo de CPU dos filtros 00 ?? field: type field: status http 2 404 3 ?? and and or and type:http status:404 type:http status:200 type:http status:(2?? | 3??) #qconrio pipes.intelie.com
  • 57. Autômatos na unha Regex match em Java é NP-difícil (em Ruby, Python, Perl etc. também) github.com/juanplopes/pyrex #qconrio pipes.intelie.com
  • 58. Autômatos na unha Em alguns casos regex nem ajudaria tanto text:food~2 PIPES blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata #qconrio pipes.intelie.com
  • 59. Tipos de filtro implementados Nem todos os tipos de filtro do Lucene foram implementados ➔ Match all: * ➔ Term: <field>:<term> ➔ Range: <field>:[<lower>, <upper>] ➔ Fuzzy: <field>:<term>~<number> ➔ AND: <filter> & <filter> ➔ OR: <filter> | <filter> ➔ NOT: -<filter> #qconrio pipes.intelie.com
  • 60. Composição de filtros Um pouco mais poderosa até que a do Lucene WebAccess PIPES #qconrio pipes.intelie.com
  • 61. Composição de filtros Um pouco mais poderosa até que a do Lucene WebAccess PIPES WebAccess browser:firefox PIPES #qconrio pipes.intelie.com
  • 62. Composição de filtros Um pouco mais poderosa até que a do Lucene WebAccess PIPES WebAccess browser:firefox PIPES WebAccess browser:(firefox|chrome) PIPES #qconrio pipes.intelie.com
  • 63. Composição de filtros Um pouco mais poderosa até que a do Lucene WebAccess PIPES WebAccess browser:firefox PIPES WebAccess browser:(firefox|chrome) PIPES WebAccess browser:(firefox|chrome|(IE* product_id#:[15, 60])) PIPES #qconrio pipes.intelie.com
  • 64. Filtros Um pequeno resumo ➔ Filtros não sabem dizer se um evento dá match ou não ➔ Apenas sabem criar o autômato que reconhece um valor ➔ Registrar um filtro significa adicionar ao autômato transições que reconheçam o valor e listeners para estados de aceite ➔ Os eventos são submetidos aos autômatos (um para cada campo) e os matchs são notificados e encadeados ➔ Código complexo (e com alta cobertura) #qconrio pipes.intelie.com
  • 65. Filtros Um pequeno resumo 00 ?? field: type field: status http 2 404 3 ?? and and or and type:http status:404 type:http status:200 type:http status:(2?? | 3??) #qconrio pipes.intelie.com
  • 66. Tipagem estática, mas sem schema O máximo para evitar problemas ➔ A linguagem não assume nada sobre o tipo dos fluxos ➔ Tipos são codificados na consulta, não em um schema externo ➔ Existe apenas um fluxo global e filtros sobre ele ➔ Somente 8 tipos são tratados pela linguagem #qconrio pipes.intelie.com
  • 67. Agregações Uma abordagem bem diferente do tradicional * => count() every minute PIPES pipes.intelie.com #qconrio count: 123 count: 456 count: 579
  • 68. Agregações Uma abordagem bem diferente do tradicional * => avg(field#) every minute PIPES pipes.intelie.com #qconrio mean: 237.44 sumw: 205 mean: 1061.08 sumw: 57 mean: 416.63 sumw: 262
  • 69. Agregações Cada agregação tem uma representação intermediária * => avg(response_time#):describe at the end > {"sumw":2125.0,"mean":2.420657513400854} MIXED * => (variance(response_time#)*count()):describe at the end > {"trees":[{"sumw":2125.0,"mean":2.420657513400854,"m2":3582.7099512146638},{"value":3481}]} MIXED pipes.intelie.com #qconrio MIXED * => median(response_time#):describe at the end > {"sketch":{"e":4.147768903288338E-5,"width":65536,"M":[...],"mask":65535,"total":2125.0}}
  • 70. Agregações Toda agregação precisa implementar três conceitos public interface Aggregation<T> extends Expression<T> { State newState(int flips); Merger newMerger(); T eval(Tree tree, WindowBounds bounds); } public interface State { void yield(Object obj); Tree flip(); } public interface Merger { void add(Tree tree); void remove(Tree tree); void clear(); Tree get(); } JAVA #qconrio pipes.intelie.com
  • 71. Agregações Toda agregação precisa implementar três conceitos intermediate representation aggregation window or reducer merger tree event state reducer evaluator result #qconrio pipes.intelie.com
  • 72. * => count() over last 5 minutes every minute count() == 16 5 minutes PIPES pipes.intelie.com #qconrio tempo Janelas de eventos Usam o mesmo mecanismo para mesclar resultados
  • 73. Janelas de eventos Usam o mesmo mecanismo para mesclar resultados * => count() over last 5 minutes every minute count() == 16 3 4 2 2 5 4 2 3 5 minutes PIPES pipes.intelie.com #qconrio tempo
  • 74. Janelas de eventos Usam o mesmo mecanismo para mesclar resultados ➔ Vantagens ◆ Quantidade de memória previsível em compile-time ◆ Permite janelas muito maiores (mês, ano, etc.) ➔ Desvantagens ◆ Output precisa ser compatível com janela ◆ Janela precisa ter tamanho múltiplo do output #qconrio pipes.intelie.com
  • 75. Por que o nome é Pipes? Unix pipelines curl http://example.com | grep somestring | wc -l | xargs echo ‘Result:’ SHELL curl grep wc xargs #qconrio pipes.intelie.com
  • 76. Encadeamento de queries A saída de uma torna-se a entrada de outra WebAccess => count() by host over last 2 hours every 5 minutes => @sort _ desc PIPES pipes.intelie.com #qconrio filter count sort
  • 77. Encadeamento de queries A saída de uma torna-se a entrada de outra Metric|WebAccess => [ @filter Metric kind:memory => avg(value#):bytes as mem by host every hour join on host @filter Metric kind:'cpu load' => avg(value#):format('0%') as cpu by host every hour join on host @filter WebAccess => count() as requests by host every hour ] => @sort requests desc PIPES pipes.intelie.com #qconrio filter filter avg filter sort filter avg count
  • 78. Encadeamento de queries A saída de uma torna-se a entrada de outra single machine filter safe semi-safe safe unsafe reducer machine mapper machine (1) filter safe semi-safe mapper unsafe semi-safe reducer mapper machine (2) filter safe semi-safe mapper safe #qconrio pipes.intelie.com
  • 79. Testes, testes e mais testes Isso não deveria ser mais novidade ➔ 17K functional SLOC ➔ 21K test SLOC ➔ 11K generated SLOC ➔ 2260 test cases ➔ 100% line coverage ➔ 96% branch coverage #qconrio pipes.intelie.com
  • 80. Agenda Porque ter uma agenda sempre dá uma boa impressão 1 PROCESSAMENTO DE EVENTOS 101 2 POR QUE MAIS UMA LINGUAGEM DE CEP? 3 DETALHES DA LINGUAGEM 4 DEMOS WHAT? WHY? HOW? WTF? pipes.intelie.com #qconrio
  • 81. Links Agora pode anotar ➔ Slides juanlopes.net/qconrio2014 ➔ Site e documentação pipes.intelie.com ➔ Tutorial interativo pipes.intelie.com/tutorial #qconrio pipes.intelie.com
  • 82. Obrigado! @juanplopes #qconrio pipes.intelie.com