Stream Processing

Me
Eu faço perguntas em reuniões que eu não sei nada e reunião explode; não é de propósito
Me chamaram de Mini Hitler

O que eu vou falar:

  • Processamento distribuído
  • Batch Processing
  • Programação Funcional
  • Stream processing
  • (Big Data)

This is Azion

Lista de pontos de presença da Azion

O que é uma CDN

This is Azion

Em média, a CDN atende 50.000 requisições/segundo.

CDN? Stream Processing?

  • Os clientes são cobrados pelo tráfego que passa pela CDN.
  • Queremos mostrar o consumo em tempo real.
  • ... para todos os clientes.
  • ...e os dados não páram de ser gerados.

CDN? Stream Processing?

Impossível guardar os 50.000 registros/segundo num banco de dados e fazer um SELECT pra ver o total.

Precisamos os dados "read ready".

Como resolver isso?

Poderíamos simplesmente ir somando o total

... se não tivéssemos várias máquinas processando.

Como resolver isso?

Poderíamos mandar todos os dados para um banco de dados e ir calculando e marcando esses como processados.

... se isso não significasse que o banco cresceria infinitamente.

... a não ser que registros antigos fosse apagados.

... que é o que serviços de mensageria fazem.

Message Brokers

Kafka Logo RabbitMQ Logo AWS SQS Logo ZeroMQ Logo

Batch Processing

sudo cat /etc/shadow | cut -d ':' -f 2 | sort | uniq -c
  • Entrada: conteúdo do arquivo /etc/shadow
  • Processamento: capturando o segundo campo separado por ":"
  • Agrupamento: ordenamento dos dados (sort + uniq)
  • Saída: total de duplicados (ainda uniq)

Batch processing seria o caso de processar os dados de um dia.

Se novos dados entrassem no total do dia, bastaria reprocessar os dados do dia.

ou do mês, ou do ano.

Apache Spark Logo Apache Hadoop Logo

Programação Funcional

Buzzwords!

  • Teoria das Categorias!
  • Monads!
  • Functors!

Funções Puras

Uma função é considerada pura se ela sempre retorna o mesmo resultado para os mesmos parâmetros.

def mult(a):
    return a * 4
mult(2)
8
mult(2)
8
class LightSwitch:
    def __init__(self):
        self.state = False

    def switch(self):
        self.state = not self.state
        print(self.state)
light = LightSwitch()
light.switch()
True
light.switch()
False
print()
INSERT INTO table (value, value)
random()

"Idempotência"

Imutabilidade

Uma vez que o dado é gerado, ele nunca muda.

(Transparência referencial)

  • map()
  • reduce()
  • fold()
  • (map lambda iterator)
  • (reduce lambda iterator)
  • (fold lambda iterator start)
  • map: transforma cada um dos elementos do iterador através do função lambda em uma nova lista.
  • reduce: remove elementos do iterador que não sejam verdadeiros pelo lambda e produz uma nova lista.
  • fold: converte todos os elementos da lista em um único valor, começando com um valor adicionar (por exemplo, sum).

Stream Processing

sudo cat /etc/shadow | cut -d ':' -f 2 | sort | uniq -c
sudo cat [broker] | cut -d ':' -f 2 | sort | uniq -c
sudo cat [broker] | map | sort | uniq -c
sudo cat [broker] | map | fold
sudo cat [broker] | map | fold
sudo cat [broker] | map | fold
sudo cat [broker] | map | fold
sudo cat [broker] | map | fold
sudo cat [broker] | map | fold
sudo cat [broker] | map | group_by | fold
sudo cat [broker] | map | group_by | fold
sudo cat [broker] | map | group_by | fold
sudo cat [broker] | map | group_by | fold
sudo cat [broker] | map | group_by | fold
Apache Storm Logo Apache Flink Logo Wallaroo  Logo Apache Beam Logo
"A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable" -- Leslie Lamport, 1987

Por falar nisso, estamos contratando :)

jobs.azion.com