Um backend de cassino que conecta slots, jogos com dealer ao vivo e jogos de mesa de muitos provedores precisa de uma única camada de agregação: sessões emitidas pelo operador, callbacks de saldo que sobrevivem a retentativas e rollbacks, rodadas que podem fechar depois da sessão e uma reconciliação diária com o próprio relatório de cada provedor. É assim que essa camada é dividida e onde as integrações com provedores costumam quebrar.
Um operador que constrói o seu próprio backend de cassino e conecta slots, jogos com dealer ao vivo e jogos de mesa de muitos provedores acaba tendo tantos contratos de integração quantos são os provedores: fluxos de lançamento diferentes, chamadas de carteira diferentes, ideias diferentes do que é uma rodada. A camada de agregação os transforma em um único contrato interno, para que a carteira, o lobby, os bônus, os limites e os relatórios sejam escritos uma única vez e cada provedor seja adaptado a eles.
O que vem a seguir é como essa camada costuma ser dividida: o que fica com o provedor, como as sessões são emitidas, como os callbacks de saldo sobrevivem a retentativas e rollbacks, como as rodadas são registradas quando fecham depois da sessão e como o resultado é reconciliado com os números do próprio provedor.
A resposta curta é um único contrato interno com um adaptador por provedor. O operador emite a sessão; todo débito, crédito e rollback carrega o ID de transação do provedor como chave de idempotência, com escopo por provedor e tipo de chamada; um rollback de uma transação que a carteira nunca viu é armazenado, então uma transação original que chega atrasada é recusada; as rodadas são registradas como um estado que pode fechar depois do fim da sessão; e o próprio relatório de cada provedor é reconciliado com o ledger da carteira todos os dias.
O provedor roda o jogo: a geração de números aleatórios, a matemática do jogo, o cliente do jogo e a certificação dele por um laboratório de testes. O operador fica com tudo o que toca o jogador e o dinheiro: identidade, saldo, limites, bônus, o lobby e os registros que um regulador ou uma disputa com um jogador podem exigir. A camada de agregação fica entre os dois e deve ser o único código do lado do servidor que fala com a API de cada provedor.
Os provedores se conectam ao dinheiro de um operador de uma de duas maneiras. Em uma carteira seamless, o saldo fica com o operador, e o provedor chama a carteira do operador a cada aposta e a cada ganho. Em uma carteira de transferência, o operador move o dinheiro para um saldo mantido do lado do provedor antes do jogo e só o traz de volta quando o solicita.
O restante deste artigo pressupõe uma carteira seamless, porque nela cada aposta e cada ganho é uma chamada à carteira.
O lançamento de um jogo começa do lado do operador. O backend verifica se este jogador pode jogar este jogo agora, o que abrange o estado da conta, a autoexclusão, os limites e se o jogo pode ser oferecido na jurisdição do jogador. Depois, cria uma sessão vinculada ao jogador, ao jogo e à moeda e passa um token opaco ao provedor no lançamento. Quando o servidor do provedor faz o callback, esse token identifica de quem é o saldo a que a chamada se refere.
Documentos publicados para operadores dizem isso com todas as letras. A API de carteira da Hub88 diz que a validade do token não deve ser validada para ganhos e rollbacks, já que eles podem chegar depois que a aposta já foi jogada. A VeliGames diz que o operador não pode rejeitar o ganho de uma rodada mesmo que a sessão tenha expirado.
Qualquer chamada entre dois servidores pode dar timeout depois que o trabalho do outro lado já foi feito. O provedor não consegue distinguir um débito que falhou de um débito cuja resposta se perdeu, então repete a chamada ou cancela a transação. O trabalho da carteira é tornar as duas coisas seguras.
Documentos de integração publicados mostram o quanto as repetições são persistentes. A API de carteira para operadores da Hub88 considera que uma aposta falhou quando não recebe HTTP 200, gera um rollback e faz até 500 novas tentativas desse rollback, com back-off exponencial. A Gamomat faz duas novas tentativas de uma requisição que falhou, com 500 ms de intervalo, depois inicia um rollback e faz novas tentativas dele em intervalos que crescem de um segundo a 30 minutos. O timeout de carteira da Tom Horn Gaming é de 10 segundos, após os quais um rollback é enviado automaticamente. Uma carteira que fica fora do ar por alguns minutos volta e encontra uma fila de repetições e rollbacks, e não silêncio.
A resposta esperada para uma repetição também não é padronizada. A Hub88 exige que requisições com o mesmo ID de transação não sejam processadas duas vezes e que a resposta seja a mesma para todas as duplicatas; a VeliGames pede um erro com HTTP status 409 e DUPLICATE_TRANSACTION; a Tom Horn Gaming tem um código de resultado separado para uma referência duplicada. O adaptador responde a cada provedor na forma própria de cada um, e o ledger por baixo continua o mesmo.
É fácil errar no rollback de uma transação desconhecida. Se a carteira não guarda nada, um débito que apenas atrasou em trânsito chega um instante depois e é bem-sucedido, e o jogador paga por uma aposta que o provedor já cancelou. Armazenar o rollback primeiro e verificar se ele existe sob o lock de conta do débito fecha essa brecha.
Os provedores declaram essa regra nos seus próprios documentos. A API para operadores da St8 diz que, quando o operador recebe, em um cancelamento, um ID de transação que ainda não processou, esse ID precisa ser salvo para impedir que ele seja processado depois. A Tom Horn Gaming espera receber o seu código de resultado de transação desconhecida quando a carteira nunca tratou a retirada a que um rollback se refere.
Uma rodada é a unidade de jogo do provedor e raramente corresponde a uma única transação. Um giro de slot costuma ser um débito e um crédito, às vezes enviados como uma única chamada. O blackjack pode acrescentar débitos em caso de split ou double. A roleta ao vivo recebe apostas de muitos jogadores durante uma janela de apostas e liquida todas elas quando o resultado é conhecido. Rodadas grátis podem gerar uma série de ganhos que formam um conjunto.
É com o histórico de rodadas que se resolve uma disputa com um jogador. Guarde cada lançamento do ledger com o provedor, o jogo, a rodada, os valores, o saldo antes e depois e dois timestamps, o do provedor e o da carteira, e vincule os detalhes da rodada do próprio provedor onde a API dele os oferecer. Com isso, uma pergunta sobre o dinheiro de um giro é respondida a partir dos registros.
Os reguladores definem o mínimo que esse histórico precisa cobrir. O GLI-19, o padrão para sistemas de jogos interativos da Gaming Laboratories International, exige um recurso que permita ao jogador rever jogos anteriores, seja como reconstituição, seja por descrição. As normas técnicas para jogo remoto da Comissão de Jogos de Azar do Reino Unido (UK Gambling Commission) exigem pelo menos três meses de histórico da conta e de jogo sem que seja preciso contatar o licenciado, e pelo menos 12 meses mediante solicitação. A diretiva de proteção ao jogador da Autoridade de Jogos de Malta (Malta Gaming Authority) dá ao jogador acesso ao seu histórico de jogo dos seis meses imediatamente anteriores.
Os slots distribuem a carga ao longo do tempo, porque cada jogador gira no seu próprio ritmo. As mesas com dealer ao vivo sincronizam os jogadores: as apostas de todos em uma mesa chegam nos segundos que antecedem o fechamento das apostas, e os ganhos de todos chegam juntos quando o resultado é conhecido. Uma mesa popular repete isso para cada jogador que apostou.
Os adaptadores são o lugar onde vivem as diferenças entre os provedores, e devem ser o único lugar onde elas vivem. Cada adaptador trata:
O contrato interno continua pequeno: abrir uma sessão, ler o saldo, debitar, creditar, debitar e creditar em uma única chamada, pagar sem aposta, fazer rollback, fechar uma rodada e um conjunto fixo de erros que a carteira pode devolver. Um novo provedor passa a ser, então, um adaptador e uma suíte de testes, raramente uma mudança na carteira.
Cada provedor mantém o seu próprio registro de cada rodada e emite faturas para o operador com base nele. O ledger da camada de agregação é o lado do operador do mesmo dinheiro. Reconcilie os dois todos os dias, pela virada do dia e pelo fuso horário de cada provedor, por provedor, moeda e jogo:
Por quanto tempo essas evidências precisam ser guardadas faz parte da integração. A Hub88 pede que cada ID de transação seja armazenado dos dois lados por pelo menos quatro meses para fins de reconciliação, e a API para operadores da Gamomat devolve dados de reconciliação para um intervalo de datas ou para uma única rodada.
A pergunta tem três tipos de resposta, e eles vendem coisas diferentes. Agregadores e fornecedores de plataforma alugam ao operador a camada deles: um contrato, muitos provedores, as condições comerciais deles. Plataformas turnkey e white-label incluem a camada dentro de uma plataforma que pertence ao fornecedor. Empresas de engenharia constroem a camada dentro do backend do operador, e o próprio operador assina os seus contratos com os provedores.
Seja qual for o tipo com que você fale, estas perguntas mostram se um time já construiu isso antes:
Uma resposta que fica no genérico nas duas primeiras significa que os casos de borda seriam descobertos em produção.
A amBrain é uma empresa de desenvolvimento de software especializada em plataformas de trading, matching engines, sistemas de real-time bidding e engenharia de plataformas de cassino. A amBrain constrói software desde 2019.
Em iGaming, os números que a amBrain publica como medidos são 500+ integrações de provedores terceiros e 12 operadores em produção.
A amBrain trabalha em três formatos: entrega completa, time dedicado ou engenheiros embarcados no seu time. O cliente mantém a propriedade integral do produto e do código, exceto dos componentes reutilizáveis da amBrain.
Este artigo explica como funciona uma camada de agregação; ele não é um estudo de caso e não nomeia nenhum cliente.
Então a primeira decisão não é quais provedores contratar. É o contrato interno ao qual todo provedor será adaptado, registrado por escrito com os seus casos de erro antes que o primeiro adaptador exista.
Traga sua arquitetura atual e o modo de falha que preocupa você, e vamos analisá-lo juntos em meia hora.