Padrão: outbox pattern
O curso trata do outbox pattern numa aplicação Rails que usa o Solid Queue. A fila fica em outro banco, então salvar um registro e enfileirar um job são dois commits que não podem ser atômicos. As aulas explicam por que nenhuma ordem dessas duas escritas é segura. Elas mostram uma tabela outbox gravada na mesma transação que o dado e um relay que a drena com FOR UPDATE SKIP LOCKED. Também abordam entrega at-least-once, duplicatas, o custo de adoção e quando não usar o padrão.
O que você vai aprender
- ✓Por que duas escritas em dois bancos não podem ser atômicas
- ✓Por que retentativas não cobrem a janela de queda e o after_commit só a estreita
- ✓Como desenhar uma tabela outbox gravada na mesma transação que o dado
- ✓Como um relay reivindica linhas com segurança usando FOR UPDATE SKIP LOCKED
- ✓Entrega at-least-once e a idempotência que ela exige dos consumidores
- ✓Quando uma reconciliação periódica é melhor escolha que um outbox
A escrita que não está na sua transação
Esta aplicação enfileira trabalho em segundo plano em poucos lugares: os mailers, os emails de notificação, os webhooks de parceiros e a busca do ícone do parceiro. O mais simples deles é app/services/admin/partners/save_partner_service.rb, mostrado aqui por inteiro:
Ler a aula completa grátis →Currículo
7 aulasA escrita que não está na sua transação
Mostra como salvar um partner e enfileirar o job do ícone caem em dois bancos com commits separados.
Por que duas escritas não podem ser atômicas
Explica por que nenhuma ordem de duas escritas é segura e por que after_commit e retentativas deixam a janela aberta.
A tabela outbox
Esboça uma tabela outbox e grava cada mensagem na mesma transação que o dado que ela descreve.
Drenando o outbox
Constrói um relay que reivindica linhas com FOR UPDATE SKIP LOCKED e explica por que quedas causam reentrega.
At-least-once, e o que isso custa
Trata da entrega at-least-once, de quando surgem duplicatas e por que todo consumidor deve aguentar rodar duas vezes.
Um outbox neste app: o que custaria
Calcula a migration, a mudança no service e o relay que este app exigiria, e por que aqui o after_commit não muda nada.
Quando não recorrer a um outbox
Defende que a maioria das aplicações, esta incluída, deveria aceitar a lacuna ou reconciliar periodicamente em vez de construir um outbox.