Zurück zu Cases
2022 · 14 Monate · Principal Engineer

Zalando SE

Distributed SystemsEvent SourcingKafka

// problem

Problem

Zalandos Bestell-Pipeline basierte auf synchrone REST-Aufrufe zwischen 180+ Microservices. Bei Traffic-Spitzen kaskadierten Timeouts. p99-Latency lag bei 2.4 Sekunden im Checkout-Flow.

// approach

Approach

Stufenweise Migration auf Event-Sourcing mit Kafka als Backbone. Jeder Service wurde einzeln migriert — zuerst Event-Publishing parallel zum REST-Call, dann Umstellung des Consumers. Die alte REST-Route blieb als Fallback 4 Wochen aktiv. Parallel wurde ein Dead-Letter-Queue-System aufgebaut um verwaiste Events abzufangen.

// code

event_publisher.go
func (p *EventPublisher) PublishOrderCreated(
    ctx context.Context,
    order Order,
) error {
    event := OrderCreatedEvent{
        ID:        uuid.New(),
        OrderID:   order.ID,
        Payload:   order.ToPayload(),
        Timestamp: time.Now().UTC(),
        Version:   schema.V2, // dual-write compat
    }
    msg, _ := json.Marshal(event)
    return p.kafka.Produce(ctx, &kafka.Message{
        TopicPartition: kafka.TopicPartition{
            Topic:     &p.topic,
            Partition: kafka.PartitionAny,
        },
        Value: msg,
        Headers: []kafka.Header{
            {Key: "event-type", Value: []byte("order.created.v2")},
            {Key: "trace-id", Value: []byte(trace.FromContext(ctx))},
        },
    })
}

// outcome

Ergebnis

73% Reduktion der Inter-Service-Latency p99 (2.4s → 0.65s)

Zero-Downtime über die komplette 14-monatige Migration

Checkout-Fehlerquote von 1.2% auf 0.03% gesenkt

Grundlage für Real-Time-Inventory-Tracking geschaffen