Messaging Workflows: JMS, Kafka & Outbox

Messaging macht Systeme lose gekoppelt, aber nur mit klaren Verträgen, Idempotenz und Beobachtbarkeit robust.

JMSKafkaOutboxIdempotenz
Messaging mit Outbox, Broker und idempotenten Consumern
Messaging mit Outbox, Broker und idempotenten Consumern

Arten

ModellTypischEigenschaft
JMS QueueCommand/Work QueueEin Consumer verarbeitet
JMS TopicPublish/SubscribeMehrere Subscriber
Kafka TopicEvent StreamPartitionen, Offset, Replay
Outbox TableZuverlässige PublikationDB und Event konsistent

Event Design

Events brauchen fachlichen Namen, Version, Zeit, Korrelation und Idempotency Key. Technische Payloads ohne Kontext sind schwer wartbar.

Versioniertes Event
public record OrderPlacedEventV1(
        String eventId,
        String traceId,
        String orderId,
        String customerId,
        Instant occurredAt,
        List<Line> lines) implements DomainEvent {}

Outbox

Outbox ist der Default, wenn ein DB-Zustand und ein Event zusammengehören. Direct publish im Use Case ist fast immer riskanter.

Consumer

Idempotent Consumer
public final class BillingOrderPlacedConsumer { // Pattern: Idempotent Consumer
    public void handle(OrderPlacedEventV1 event) {
        if (processedEvents.alreadyProcessed(event.eventId())) return;
        billing.createDraftInvoice(event.orderId(), event.customerId());
        processedEvents.markProcessed(event.eventId());
    }
}

Fehler

Fehlerstrategie: Retry für temporäre Fehler, Dead Letter Queue für nicht verarbeitbare Nachrichten, Alerting bei wachsendem Lag.

Vergleich

KriteriumJMSKafka
Klassische Enterprise IntegrationSehr starkMöglich, aber anderes Modell
Replay historischer EventsBegrenztStark
OrderingQueue/Session-basiertPartition-basiert
Cloud-native StreamsMittelSehr stark
⌂ Cockpit