Em 2019, criei um software que impactou 7 milhões de usuários com pico de quase 100 mil em 24 horas, conforme o Google Analyics abaixo. Clique na imagem para expandi-la.
1. O problema
Esse negócio é composto por sites de conteúdo e um software que aplica arbitragem de tráfego.
Para contextualizar, arbitragem de tráfego possui o mesmo comportamento de arbitragem no mercado financeiro, no qual monta-se uma operação de compra e outra de venda de ativos correlacionados para lucrar com a diferença.
Na arbitragem de tráfego, compra-se tráfego (visitas de pessoas) para um site de conteúdo, que possui anúncios gerando dinheiro, para lucrar com a diferença entre a receita gerada pelos anúncios menos a despesa gasta para comprar o tráfego.
Como essa compra de tráfego funciona em real time bidding, definir o preço de compra uma vez por dia é ineficiente quando comparado a definição de preço de compra em tempo real (a cada 20 mins, por exemplo) em função do resultado financeiro (receita operacional menos despesa operacional) calculado em tempo real. Esse é o problema a ser resolvido.
2. A solução
A arquitetura da solução está na imagem abaixo. Usei uma formatação livre.
À seguir, a descrição de cada numeração da imagem.
1. Usuário do site acesso o conteúdo
Uma pessoa está lendo um conteúdo na ISTOÉ, por exemplo, e clica em uma matéria de um site de conteúdo gerenciado pelo software que criei.
O Taboola redireciona a pessoa para o site de conteúdo e torna-se usuário do site.
2. Site envia dados ao Redis
O site de conteúdo envia dados da visita (pageview) para o Redis no qual armazena esses dados em memória.
3. Crontab aciona a cadeia de processos batches
O crontab executa o início da cadeia de processos batches. Ele encontra-se configurado para executar a cada 20 minutos.
4. Execução do processo batch para cálculo de visitas
O processo batch para cálculo de visitas dos sites de conteúdo obtém do Redis os dados das visitas que nele constam e armazena-os em disco no MySQL.
Ao final do processamento de inserção desses dados, o processo apaga do Redis esses dados que foram inseridos em disco.
5. Execução do processo batch para cálculo de despesa
O processo batch para cálculo de despesa acessa o Taboola para obter o CPC de cada campanha que encontra-se rodando.
Com esses dados obtidos e os dados das visitas, o processo atualiza a despesa de cada campanha no MySQL.
6. Execução do processo batch para cálculo de receita
O processo batch para cálculo de receita acessa o Google Ad Manager para obter a receita de cada campanha rodando.
O Ad Manager é usado para gerenciar o inventário dos sites de conteúdo. A receita é originada e obtida pelo Ad Manager no Google AdSense e DoubleClick Ad Exchange.
7. Execução do processo batch para cálculo de oferta
O processo batch para cálculo de oferta acessa o Taboola para obter as campanhas rodando, acessa o MySQL para obter a receita a despesa de cada campanha, calcula o novo CPC para atingir a porcentagem de lucro desejado e previamente configurado.
Com isso, envia o novo CPC para cada campanha ao Taboola e armazena tal operação no MySQL.
8. Execução do processo batch para geração de relatório
O processo batch para geração de relatório executa uma query no MySQL para “tirar uma foto” do estado atual dos dados que o seja possível gerar gráficos, conforme visto no próximo item abaixo.
9. Usuário do software acessa o relatório
O usuário do software acessa o front-end do software para acessar os relatórios e gráficos a fim de acompanhar os dados e, se necessário, tomar uma ação. Abaixo, um exemplo para uma campanha rodando no site ISTOÉ.
3. A conclusão
O uso de dados em memória, assim como no software de 141 milhões de usuários, foi fundamental para que o banco de dados do software tivesse consistente armazenando os dados de todas as pageviews (imagem abaixo). Caso contrário, a despesa seria calculada errada e faria um efeito cascata negativo no software gerando prejuízo.
Como os processos batches executavam muitos dados em tempo real, foi necessário minimizar o acesso ao disco fazendo com que carregassem os dados que seriam utilizados no processamento do disco para a memória no início do processamento.
O efeito da pandemia trouxe problemas para esse negócio. É possível observar na imagem acima que o gráfico de pageviews foi à quase zero no início de Abril até o fim de Abril. Nessas semanas, eu precisei reescrever boa parte do software.
Ser antifrágil, manter as coisas simples, escrever somente código necessário e escrever componentes com alta coesão e baixo acoplamento foram fundamentais para que essa reescrita fosse bem-sucedida gerando a nova versão do software e nova versão de mim melhores do que antes.