Pular para o conteúdo principal
Open Source · Apache 2.0 · v1.0.4

Orquestração de sagas para Spring Boot.Compense falhas automaticamente, sem overhead de infraestrutura.

O Sagaweaw compensa automaticamente o que não consegue completar — rodando no PostgreSQL que você já tem. Sem novo cluster. Sem novos conceitos.

Java 17+·Kotlin·Spring Boot 4.x·PostgreSQL · MySQL · H2·Sem infraestrutura extra
Todo time de sistemas distribuídos passa por isso

Uma transação começou,
chegou na metade e parou.

Agora você tem estado inconsistente entre serviços. O pagamento foi cobrado, o estoque está bloqueado, mas não há pedido para mostrar.

Alguém escreve um script de recuperação. Outra pessoa é acionada. Um ticket de suporte aparece. E isso acontece de novo na semana seguinte.

refund() executa automaticamente — $127,00 devolvidos
release() executa automaticamente — 2 unidades liberadas
Nenhum alerta de plantão. Nenhum script de recuperação. Nenhum ticket às 2h.
produção · order-service · 02:47
02:41:03POST /charge — $127,00 cobrado no cartão
02:41:04POST /inventory — 2 unidades reservadas
02:41:09POST /shipping — 503 Service Unavailable
02:41:09pedido #f3a9b2c1 travado em EXECUTING
02:41:10🔔Alerta PagerDuty — engenheiro de plantão notificado
Com o Sagaweaw, em vez disso:
02:41:09compensando charge-payment → refund()
02:41:09compensando reserve-inventory → release()
02:41:10saga #f3a9b2c1 COMPENSADA — nenhum dado vazou
A solução

Escreva a lógica de negócio. O Sagaweaw cuida do resto.

  • Compensação executa em ordem inversa, automaticamente
  • Retry com backoff exponencial, por passo
  • Trilha de auditoria completa no seu banco de dados
  • Spans OpenTelemetry — zero configuração
  • Uma dependência Spring Boot — só isso
Ver o quickstart completo →
OrderSaga.java
return saga
    .step("reserve-inventory")
        .invoke(ctx -> inventory.reserve(ctx.itemId()))
        .compensate(ctx -> inventory.release(ctx.itemId()))

    .step("charge-payment")
        .invoke(ctx -> payment.charge(ctx.amount()))
        .compensate(ctx -> payment.refund(ctx.chargeId()))
        .retryPolicy(exponential(3, Duration.ofSeconds(5)))

    .step("create-shipment")
        .invoke(ctx -> shipping.schedule(ctx.orderId()))
        .compensate(ctx -> shipping.cancel(ctx.orderId()))

    .build();
Como funciona

Compensação automática

Se qualquer passo falhar, o Sagaweaw executa as compensações em ordem inversa — automaticamente. Nenhum dado fica para trás.

  • Retry exponencial, fixo ou infinito por passo
  • Estado durável — sobrevive a crashes e reinicializações
  • Pivot point — ponto de não retorno configurável
  • Dead letters para intervenção manual cirúrgica
Ver o ciclo de vida →
reserve-inventory
charge-payment
create-shipment
 

Veja cada saga, em tempo real

O dashboard embutido é sua lupa de debug — feed ao vivo, linha do tempo de passos, fila de retry, dead letters, busca por ID de negócio e detecção de sagas travadas. Tudo na porta que você escolher.

localhost:8484/sagaweaw
Sagaweaw Dashboard — Feed

Tudo que você precisa para transações distribuídas

Construído sobre decisões arquiteturais sólidas e padrões testados em produção. Gratuito, para sempre.

Funciona bem com o que você já usa

Sem novas ferramentas para aprender. Métricas no Prometheus, traces no seu backend OTel, logs com MDC — o banco que você já tem. Zero nova infraestrutura.

Spring Boot
Auto-configurado
Kotlin
sagaweaw-kotlin DSL
PostgreSQL
MySQL · H2
Prometheus
Scraping automático
Grafana
Template incluído
OpenTelemetry
Jaeger · Tempo · DD
Micrometer
Instrumentação nativa
MDC / Logback
Logs enriquecidos
Webhooks
Slack · Discord · PD

Adicione spring-boot-starter-opentelemetry e os spans das sagas aparecem automaticamente no seu backend OTel. Ver documentação →

Rodando em 5 minutos

Uma dependência. Sem novo cluster. Sem boilerplate.

1

Adicione a dependência

sagaweaw-spring-boot-starter
2

Escreva sua saga

@Saga + SagaDefinition<T>
3

Inicie

sagaManager.start(context)
Open Source · Apache 2.0

Pronto para parar de escrever scripts de recuperação?

Gratuito para sempre. Sem lock-in. Sem servidor externo. Só adicione a dependência.