REST, gRPC e webhooks em iGaming: pattern e anti-pattern
Texto completo do artigo
1) Mapa de protocolos: quem é responsável por quê
O REST é uma consulta sincronizada universal por HTTP/JSON. Transparente kesh, depuração simples, é conveniente para integrações B2B e admin-API.
gRPC - RPC binário de alta performance sobre HTTP/2: baixa latência, striptease, circuitos rígidos. Bom para rotas de dinheiro quentes (wallet/setle), serviços internos e striptease de longa duração (live).
Webhooks - chamadas reversíveis (callback) do destinatário para o remetente. Usado para eventos («o dinheiro caiu», «o limite funcionou»), onde o iniciador nem sempre é alguém à espera do resultado.
Regra de ouro:- O dinheiro segue RPC sincronizado (REST/gRPC) com invariantes rígidos e idimpotentes. Telemetria e eventos de negócios - asinhrônico (webhooks + pneu de eventos).
2) Caminhos típicos e canais recomendados
3) Design orientado contrato
3. 1 REST (fatias)
POST /v1/bets/authorize
Headers: X-Idempotency-Key: bet_r_8c12_1, X-Trace-Id: tr_a1b2
{
"session_id":"s_456",  "bet_id":"b_001",  "round_id":"r_8c12",  "amount":{"amount":2. 00,"currency":"EUR"}
}
→ 200 {"status":"authorized","hold_id":"h_zz1"}
409
{"code":"DUPLICATE","message":"Bet already authorized","retryable":false,"trace_id":"tr_a1b2"}3. 2 gRPC (protobuf, simplificado)
proto syntax = "proto3";
package wallet. v1;
message Money { int64 minor_units = 1; string currency = 2; } // cents message AuthorizeBetReq { string session_id=1; string bet_id=2; string round_id=3; Money amount=4; string idempotency_key=5; }
message AuthorizeBetRes { string status=1; string hold_id=2; }
service Wallet {
rpc AuthorizeBet(AuthorizeBetReq) returns (AuthorizeBetRes);
rpc SettleBet(SettleReq) returns (SettleRes);
}3. 3 Webhooks (exemplo de assinatura)
POST https://provider. example/webhooks
{
"topic":"wallet. credit. ok",  "callback_url":"https://rgs. example/journal",  "secret":"", "version":"1. 2"
}
POST https://rgs. example/journal
Headers: X-Signature: sha256=..., X-Trace-Id: tr_a1b2
{
"event_type":"wallet. credit. ok",  "schema_version":"1. 2. 0",  "event_id":"uuid",  "payload":{"player_id":"p_19f3","amount":{"minor_units":1460,"currency":"EUR"}}
}4) Idempotidade e coerência
Exija sempre 'X-Idempotency-Key' em operações write (REST/gRPC metadata). A repetição → a mesma resposta.
A composição da chave está vinculada a parâmetros empresariais (por exemplo, 'bet _ id + amount').
Sagas para processos longos (athorize → commit/lock → setle → credit).
Outbox/CDC: Eventos são registrados atômicamente ao lado da transação e publicados no exterior.
5) Versionização e compatibilidade
REST - '/v1/... '+' Deprecation/Sunset '- as cabeças; gRPC — `package wallet. v1`; eventos - 'schema _ version' em corpos + registro de esquemas.
SemVer: menor - campos optional/novos endpoants; major - novo caminho/pacote, «carta dupla» de eventos na migração.
Nunca mude a semântica de estatais em dinheiro sem a versão major.
6) Segurança dos transportes
mTLS em todos os S2S; para webhooks - assinatura corporal (HMAC/EdDSA) + timestamp e janelas de validade.
Limitação de escopos (OAuth2 CC) e segmentação de chaves per brand/region.
Zero-trust: políticas de rede, tokens de curta duração, Vault/HSM, auditoria WORM de ações críticas.
7) Observabilidade e SLO
O 'trace _ id' de volta no REST, gRPC metadata e webhooks.
Métricas: p50/p95/p99 latency, error rate por código, throughput, lag filas.
SLO-mínimo (orientações):- Wallet p95 '<150 ms' (Athorize/Setle), REST público B2B p95 '<300 ms', Webhooks entregues '<5 min' Percentil 99, 'Setlems perdidos/duplicados' = 0.
8) Retraias, backoff e ordem de entrega
REST/gRPC: backoff exponencial, jitter, limite de duração (deadline/timeout).
Webhooks: entrega repetida até '2xx'; salvar a ordem por chave ('player _ id/round _ id') ou deduzir no receptor.
Anti-tempestades: limite de retrações paralelas, circuito breaker, rate limit.
9) Patrões de integração
Pattern A: «Dinheiro sincronizado, eventos asinhrônicos»
1. RGS → Wallet (gRPC/REST) `authorize` → `settle/credit`.
2. Paralelamente, «bet» é publicado. setled no pneu, e o provedor recebe um recibo de webhook.
Mais dinheiro rápido, observabilidade. Menos, são precisos dois circuitos.
Pattern B: «Streaming live»
O núcleo live ↔ Bridge através do gRPC streaming (status da mesa, janela de apostas).
Transações em dinheiro - unary RPC individual; eventos em pneus/webhooks.
Além disso, o atraso mínimo nas estatais vivas.
Pattern C: «B2B público REST»
Diretórios/bónus/afiliados/relatórios - REST com paginação cursor, filtros, etag.
Além disso, a simples integração dos parceiros.
10) Anti-pattern (bandeiras vermelhas)
Transações em dinheiro somente através de webhooks (sem confirmação sincronizada).
Falta de 'Idempotency-Key' → duplicação de débitos/empréstimos.
Publicar eventos contornando outbox/CDC (eventos perdidos).
Webhooks sem assinatura ou marca de tempo → troca.
Mistura PII/dinheiro de diferentes regiões em um canal sem marcas 'region/tenant'.
Grandes binary payload em webhooks (quebram retraias e limites).
Degradação zero, queda de webhooks bloqueia dinheiro.
gRPC sem deadline e sem backoff - conexões dependentes, esgotamento de recursos.
11) Folhas de cheque
Arquiteto/plataforma
- Dinheiro com gRPC/REST de idoneidade, eventos com webhooks/pneus.
- Outbox/CDC em todos os caminhos de dinheiro.
- `/vN` и schema registry; Deprecation/Sunset processo.
- mTLS + assinaturas de webhooks; segredos per brand/region.
- SLO-dashboard p95/p99, errador rate, webhook-lag.
- Dr./xaoc-ensinamentos: captura-entrega, out-of-order, afastamento da região.
Provedor/RGS
- Envio 'X-Trace-Id' e 'X-Idempotency-Key'.
- Retraí com backoff e dedução; Pronto para voltar a entregar webhooks.
- Atualizo as versões dos contratos; respondo a 'Deprecation/Sunset'.
- Logs/métricas por códigos de erro e hora.
12) Mini-soluções para malas afiadas
Safari/ITP e third-party limitações: dinheiro - no hóspede (REST/gRPC), conteúdo iFrame se comunica através de 'postMessage'; As webhooks do hóspede, não da iFrame.
Multiplicador: marcas de formatação 'tenant _ id/brand _ id/license' em cabeçalhos e eventos; chaves/certificados separados.
Grandes saliências (torneios): antes dos webhooks - tampão/fila com DLQ; quando a sobrecarga é «no new sessions »/» pause non-core hooks».
13) Exemplos de alertas orientados SLO
Wallet. Autorize p95> 150 ms 5 min consecutivas.
Erros 'DUPLICATE/IDEMPOTENCY _ MISMATCH'> 0. 5% em 10 minutos.
Webhook lag p99> 180 c sobre o tema 'bet. settled`.
Consumer lag em Kafka> 30 c para 'wallet. credit.`.
14) Conclusão
O REST, gRPC e webhooks no iGaming não são tecnologias de intercâmbio, mas partes de um mesmo modelo operacional.
Há invariantes em dinheiro, baixa latência, idempotidade, SLA rigoroso.
Webhooks/pneus garantem transparência e escala: eventos, telemetria, integração.
Adicione outbox/CDC, versionização, assinaturas e observabilidade - e obtenha uma arquitetura onde o dinheiro se mova rápido e seguro, os eventos não se perdem e os upgrades passam indolor.
