0Pricing
Advanced Spring Boot 4: Event-Driven Architecture (Kafka) · Aula

O padrão de caixa de saída transacional

Aprenda como o padrão de caixa de saída transacional conecta de forma confiável uma transação de banco de dados à publicação no Kafka, evitando inconsistências de gravação dupla no Spring Boot.

O padrão de caixa de saída transacional é uma aula grátis de Advanced Spring Boot 4: Event-Driven Architecture (Kafka) no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Advanced Spring Boot 4: Event-Driven Architecture (Kafka), e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Advanced Spring Boot 4: Event-Driven Architecture (Kafka) inclui 4 aulas no total.

Partes desta aula ainda não foram traduzidas e aparecem em inglês.

The Dual-Write Problem

A common bug: a service updates its database and publishes a Kafka event in two separate operations. If one succeeds and the other fails, the system becomes inconsistent.

The transactional outbox pattern eliminates this risk.

Core Idea

Instead of publishing directly, write the event into an outbox table within the same database transaction as your business change.

A separate process then reads the outbox and publishes to Kafka.

The Outbox Table

The outbox table stores serialized events plus metadata.

CREATE TABLE outbox (
  id UUID PRIMARY KEY,
  aggregate_type VARCHAR(255),
  aggregate_id VARCHAR(255),
  event_type VARCHAR(255),
  payload JSONB,
  created_at TIMESTAMP DEFAULT now(),
  published BOOLEAN DEFAULT false
);

Writing in One Transaction

Both the domain entity and the outbox row are saved inside one @Transactional method, so they commit or roll back together.

@Transactional
public void placeOrder(Order order) {
    orderRepository.save(order);
    outboxRepository.save(OutboxEvent.from(order));
}

Atomicity Guarantee

Because both writes share the database transaction, there is no window where the order exists without its event recorded. This is the key correctness property.

The Relay Process

A background relay polls unpublished outbox rows and sends them to Kafka, marking them published on success.

@Scheduled(fixedDelay = 500)
public void relay() {
    for (OutboxEvent e : outboxRepository.findUnpublished()) {
        kafkaTemplate.send(e.getTopic(), e.getPayload());
        e.markPublished();
    }
}

At-Least-Once Publishing

If the relay crashes after sending but before marking published, the event is sent again. Consumers must therefore be idempotent, often using the event id as a dedup key.

Change Data Capture Alternative

Instead of polling, tools like Debezium tail the database transaction log and stream outbox inserts to Kafka automatically — lower latency and no polling load.

Cleaning Up the Outbox

Periodically delete or archive published rows to keep the table small and queries fast.

DELETE FROM outbox WHERE published = true AND created_at < now() - INTERVAL '7 days';

When to Use It

Use the outbox when you must keep a database state change and an event publication consistent. It is simpler and more portable than spanning a Kafka transaction across an external database.

Putting It Together

The outbox pattern turns two unreliable writes into one atomic database commit plus a reliable relay. Combine it with idempotent consumers for end-to-end consistency.

Quick Check

Test your understanding of the outbox pattern.

Recap

You learned the transactional outbox pattern.

  • Avoids dual-write inconsistency by using one DB transaction.
  • An outbox table stores pending events.
  • A relay (polling or CDC) publishes to Kafka.
  • Consumers must be idempotent due to at-least-once delivery.

Perguntas Frequentes

A aula “O padrão de caixa de saída transacional” é grátis?

Sim — o texto completo de “O padrão de caixa de saída transacional” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Advanced Spring Boot 4: Event-Driven Architecture (Kafka), atualize para CoddyKit PRO. O curso de Advanced Spring Boot 4: Event-Driven Architecture (Kafka) inclui 4 aulas no total.

O que vou aprender em “O padrão de caixa de saída transacional”?

Aprenda como o padrão de caixa de saída transacional conecta de forma confiável uma transação de banco de dados à publicação no Kafka, evitando inconsistências de gravação dupla no Spring Boot. Você pratica Advanced Spring Boot 4: Event-Driven Architecture (Kafka) com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Advanced Spring Boot 4: Event-Driven Architecture (Kafka)?

Nenhuma experiência prévia é necessária. Advanced Spring Boot 4: Event-Driven Architecture (Kafka) no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “O padrão de caixa de saída transacional”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Advanced Spring Boot 4: Event-Driven Architecture (Kafka)?

Sim. Cada aula de Advanced Spring Boot 4: Event-Driven Architecture (Kafka) inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Compreensão das transações do Kafka
  2. Implementação de produtores transacionais
  3. Semântica de processamento exatamente uma vez
  4. O padrão de caixa de saída transacional
← Voltar para Advanced Spring Boot 4: Event-Driven Architecture (Kafka)