Peter Morgan explicou em uma palestra na QCon São Francisco 2015 e em várias outras ocasiões, como arquitetar um sistema altamente escalável e dinâmico sem cache de nenhum dado. Peter é chefe de engenharia na empresa de apostas desportivas William Hill.
Desde que os números mudam constantemente em eventos esportivos conforme o jogo progride, assim como os valores das apostas que podem ser comprados de volta a qualquer momento antes da liquidação. Um cliente pode apostar em quase qualquer ação em um evento, como quem ficará com o próximo ponto no tênis, ou marcar o próximo gol no futebol, bem como a pontuação final e o vencedor. Entretanto nenhum dado pode ser armazenado, e os valores de tudo o que acontece no sistema devem estar atualizados. Um processo independente do Erlang modela os objetos de domínio que são alimentados por fluxos de dados a partir do Kafka. Os processos podem então recalcular instantaneamente os valores do sistema. Uma vez que os processos no Erlang são naturalmente distribuídos e os dados não são compartilhados, isso facilita a escalabilidade. As apostas são feitas durante todo o dia, online, por telefone ou em lojas. A falha não é uma opção, e uma vez que a empresa opera no mundo todo, não existe uma janela para que o sistema fique off-line.
A arquitetura de alto nível é ilustrada na figura:
Os jogos são alimentados com a compra dos fornecedores que são alimentados por um modelo de negociação.
Cada esporte tem o próprio modelo de negociação. Por exemplo, se um chute é feito, um milhão de simulações serão executadas para determinar, com base no evento, quais são as probabilidades de um evento acontecer (tal como se o time A ou time B ganhar). O fluxo de dados resultante de precificação dinâmica é enviado para o engine de apostas. Os modelos de negociação são propriedade intelectual da William Hill.
O engine de apostas é composto de quatro partes:
- Captura - pega a aposta do cliente;
- Pagamento - é o pagamento para um cliente, se desejado que o engine compre novamente sua aposta;
- Liquidação - realiza o pagamento se um cliente ganha;
- Responsabilidade - mede o que é devido aos clientes conforme os jogos evoluem.
Cada um destes resultados é um fluxo de dados correspondente. Cada fluxo é apresentado como um tópico Kafka.
Analytics é a inteligência da máquina aplicada aos dados para analisar se as coisas que aparentemente estão acontecendo nos modelos estão realmente acontecendo.
Cada objeto de domínio é um processo Erlang. Uma vez que a única maneira de acessar um processo Erlang é enviando uma mensagem. Os processos Erlang fornecem incrível concorrência que permitem uma distribuição natural do trabalho sobre uma série de núcleos em uma máquina virtual. Isto permite uma rápida recuperação de dados em casos de recuperação de desastres. Tudo acontece na memória, e as mensagens são enviadas da mesma maneira tanto na mesma rede como em redes diferentes.
O gráfico de processos Erlang corresponde ao gráfico de dados. Portanto, se em uma determinada corrida de cavalos, as chances de determinado cavalo mudam, uma mensagem é enviada para o processo de modelo deste cavalo. Esse processo, em seguida, envia uma mensagem para todos os processos de modelo que apostam nesse cavalo para remarcar-se, que enviam as mensagens apropriadas para os processos associados a apostas.
Gargalos são fáceis de encontrar nesta arquitetura, eles são os processos com a maior fila.
Uma das possibilidades de melhoria nesta arquitetura é usar o Kafka para distribuir a carga para diferentes data centers. Uma vez que o sistema não mantém estado, é possível executar múltiplos mecanismos de liquidação em locais diferentes e cada um realizará o mesmo trabalho. A carteira entende que viu uma transação antes e não vai postar duplicatas.
Uma arquitetura com base em fluxos e processos distribuídos permitiu a William Hill a construção de um sistema dinâmico e escalável que sempre deve estar atualizado.