KAFKA
Intermediaire

Retour d'Experience: 5 Ans de Kafka au Credit Agricole

Retour d'Experience: 5 Ans de Kafka au Credit Agricole

Decouvrez les lecons apprises apres 5 ans d'exploitation de Kafka a grande echelle : evolution de l'architecture, defis rencontres, solutions mises en place, et metriques cles (47 clusters, 1.4M msg/sec).

Florian Courouge
20 min de lecture
2,162 mots
0 vues
Kafka
REX
Enterprise
Architecture
Production
Credit Agricole
Banking
Scalability

Retour d'Experience: 5 Ans de Kafka au Credit Agricole

Apres 5 annees a deployer, exploiter et faire evoluer Apache Kafka dans un contexte bancaire a grande echelle, je partage les lecons apprises, les defis surmontees et les patterns qui ont fonctionne. Ce retour d'experience couvre l'evolution d'une architecture de quelques brokers vers un ecosysteme de 47 clusters traitant 1.4 million de messages par seconde.

Architecture Kafka Enterprise

Contexte et Chiffres Cles

L'Ecosysteme Kafka en Production

Apres 5 ans d'evolution, voici les metriques actuelles de la plateforme :

┌─────────────────────────────────────────────────────────────────┐
│                    KAFKA @ CREDIT AGRICOLE                       │
├─────────────────────────────────────────────────────────────────┤
│  Clusters         │  47 (prod, preprod, dev, DR)                │
│  Brokers          │  180+ brokers en production                 │
│  Topics           │  2,400+ topics actifs                       │
│  Partitions       │  45,000+ partitions                         │
│  Throughput       │  1.4M messages/seconde (pic)                │
│  Data Volume      │  12 TB/jour ingestees                       │
│  Equipes          │  150+ equipes utilisatrices                 │
│  Applications     │  400+ applications connectees               │
└─────────────────────────────────────────────────────────────────┘

Evolution de l'Architecture

2019                    2021                    2024
┌────────┐         ┌────────────────┐    ┌────────────────────────┐
│1 cluster│   →    │ 5 clusters     │ → │ 47 clusters            │
│3 brokers│        │ 20 brokers     │    │ 180 brokers            │
│POC      │        │ Multi-tenant   │    │ Federated Platform     │
└────────┘         └────────────────┘    └────────────────────────┘

Phase 1 : Les Debuts (2019-2020)

Premier POC et Adoption

Le premier cas d'usage etait simple : remplacer un systeme de fichiers batch par du streaming temps reel pour la detection de fraude.

Architecture initiale :

┌──────────────────┐    ┌─────────────────┐    ┌──────────────────┐
│  Systeme         │    │     Kafka       │    │   Moteur de      │
│  Transactionnel  │───▶│   (3 brokers)   │───▶│   Detection      │
│                  │    │                 │    │   Fraude         │
└──────────────────┘    └─────────────────┘    └──────────────────┘

Resultats du POC :

  • Latence reduite de 15 minutes a 200ms
  • Taux de detection fraude +35%
  • ROI valide en 6 mois

Premieres Erreurs Commises

Erreur 1 : Sous-dimensionnement des partitions

# Configuration initiale (ERREUR)
kafka-topics.sh --create --topic transactions \
  --partitions 3 --replication-factor 2

# Probleme : impossibilite de scaler les consumers
# On ne peut pas reduire le nombre de partitions !

Lecon apprise : Toujours prevoir la croissance. Nous avons adopte la regle :

Partitions = max(expected_throughput_MB/s * 2, consumer_instances * 3)

Erreur 2 : Pas de strategie de nommage

# Noms de topics chaotiques au debut
topic1, myTopic, FRAUD_DETECTION, fraud-detection-v2

# Convention adoptee ensuite
<domain>.<subdomain>.<entity>.<version>
banking.fraud.transactions.v1
banking.fraud.alerts.v1

Erreur 3 : Securite negligee

Au depart, pas d'authentification. Erreur critique dans un contexte bancaire.

# Configuration securisee adoptee
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
ssl.client.auth=required

Phase 2 : Industrialisation (2020-2022)

Architecture Multi-Tenant

Avec l'adoption croissante, nous avons du passer d'un cluster unique a une architecture multi-tenant :

┌─────────────────────────────────────────────────────────────────┐
│                    KAFKA PLATFORM LAYER                          │
│                                                                  │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│  │ Cluster     │  │ Cluster     │  │ Cluster     │             │
│  │ FRAUDE      │  │ PAIEMENTS   │  │ MARKETING   │             │
│  │ (Critical)  │  │ (Critical)  │  │ (Standard)  │             │
│  └─────────────┘  └─────────────┘  └─────────────┘             │
│                                                                  │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │              SHARED SERVICES                                 ││
│  │  - Schema Registry (central)                                ││
│  │  - Monitoring (Prometheus/Grafana)                          ││
│  │  - Topic Catalog & Governance                               ││
│  │  - Self-Service Portal                                      ││
│  └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘

Mise en Place des Quotas

Un des plus grands defis : eviter qu'une equipe ne monopolise les ressources.

# quotas.properties
# Quota producer : 10 MB/s par client
quota.producer.default=10485760

# Quota consumer : 20 MB/s par client
quota.consumer.default=20971520

# Quotas specifiques par equipe
user.fraud-detection.producer_byte_rate=52428800
user.fraud-detection.consumer_byte_rate=104857600

Script de gestion des quotas :

#!/bin/bash
# set-team-quota.sh

TEAM=$1
PRODUCER_MB=$2
CONSUMER_MB=$3

kafka-configs.sh --bootstrap-server $BOOTSTRAP_SERVERS \
  --alter --add-config "producer_byte_rate=$((PRODUCER_MB * 1024 * 1024)),consumer_byte_rate=$((CONSUMER_MB * 1024 * 1024))" \
  --entity-type users --entity-name $TEAM

echo "Quotas configured for team $TEAM: Producer=${PRODUCER_MB}MB/s, Consumer=${CONSUMER_MB}MB/s"

Schema Registry et Gouvernance des Donnees

L'introduction du Schema Registry a ete un tournant majeur :

┌─────────────────────────────────────────────────────────────────┐
│                    SCHEMA GOVERNANCE                             │
│                                                                  │
│  Producer App ──▶ Schema Registry ──▶ Validation ──▶ Kafka     │
│                         │                                        │
│                         ▼                                        │
│              ┌─────────────────────┐                            │
│              │  Schema Evolution   │                            │
│              │  - BACKWARD         │                            │
│              │  - FORWARD          │                            │
│              │  - FULL             │                            │
│              └─────────────────────┘                            │
└─────────────────────────────────────────────────────────────────┘

Exemple de schema Avro adopte :

{
  "type": "record",
  "name": "Transaction",
  "namespace": "com.ca.banking.fraud",
  "fields": [
    {"name": "transaction_id", "type": "string"},
    {"name": "amount", "type": "double"},
    {"name": "currency", "type": "string", "default": "EUR"},
    {"name": "timestamp", "type": "long", "logicalType": "timestamp-millis"},
    {"name": "customer_id", "type": "string"},
    {"name": "merchant_id", "type": ["null", "string"], "default": null},
    {"name": "metadata", "type": {"type": "map", "values": "string"}, "default": {}}
  ]
}

Phase 3 : Scale et Maturite (2022-2024)

Federation des Clusters

Avec 47 clusters, la gestion centralisee est devenue critique :

┌─────────────────────────────────────────────────────────────────┐
│                    FEDERATED KAFKA PLATFORM                      │
│                                                                  │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │                 CONTROL PLANE                              │  │
│  │  - Cluster Registry                                        │  │
│  │  - Topic Catalog                                           │  │
│  │  - Access Management (RBAC)                                │  │
│  │  - Quota Management                                        │  │
│  │  - Audit Logging                                           │  │
│  └──────────────────────────────────────────────────────────┘  │
│                              │                                   │
│              ┌───────────────┼───────────────┐                  │
│              ▼               ▼               ▼                  │
│         ┌────────┐     ┌────────┐     ┌────────┐              │
│         │Region 1│     │Region 2│     │Region 3│              │
│         │Paris   │     │Lyon    │     │DR Site │              │
│         │15 clusters│  │12 clusters│  │20 clusters│           │
│         └────────┘     └────────┘     └────────┘              │
└─────────────────────────────────────────────────────────────────┘

Cross-Datacenter Replication

Pour le Disaster Recovery, nous avons implemente MirrorMaker 2 :

# mm2.properties
clusters = paris, lyon, dr
paris.bootstrap.servers = paris-kafka-1:9092,paris-kafka-2:9092
lyon.bootstrap.servers = lyon-kafka-1:9092,lyon-kafka-2:9092
dr.bootstrap.servers = dr-kafka-1:9092,dr-kafka-2:9092

# Replication active-active Paris <-> Lyon
paris->lyon.enabled = true
lyon->paris.enabled = true

# DR uni-directionnel
paris->dr.enabled = true
lyon->dr.enabled = true

# Topics critiques repliques
paris->lyon.topics = banking\\.fraud\\..*,banking\\.payments\\..*
replication.factor = 3
sync.topic.configs.enabled = true

Metriques de replication :

┌─────────────────────────────────────────────────────────────────┐
│              REPLICATION METRICS                                 │
├─────────────────────────────────────────────────────────────────┤
│  Paris → Lyon    │  Lag: 50ms avg    │  Throughput: 500K msg/s │
│  Lyon → Paris    │  Lag: 55ms avg    │  Throughput: 400K msg/s │
│  Paris → DR      │  Lag: 120ms avg   │  Throughput: 800K msg/s │
│  Lyon → DR       │  Lag: 125ms avg   │  Throughput: 600K msg/s │
└─────────────────────────────────────────────────────────────────┘

Optimisations Performance

Apres 5 ans d'experience, voici les configurations optimales identifiees :

Configuration Broker (production critique) :

# server.properties - Production Banking

# Replication et durabilite
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false

# Performance I/O
num.io.threads=16
num.network.threads=8
num.replica.fetchers=4

# Retention adaptee au contexte reglementaire
log.retention.hours=720  # 30 jours
log.retention.bytes=-1   # Pas de limite par taille
log.segment.bytes=1073741824  # 1GB

# Buffer et batch
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600

# Compression
compression.type=lz4

Configuration Producer (high throughput) :

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);

// Durabilite maximale
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);

// Performance
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 65536);  // 64KB
props.put(ProducerConfig.LINGER_MS_CONFIG, 5);
props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4");
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 67108864);  // 64MB

// Retry et timeout
props.put(ProducerConfig.RETRIES_CONFIG, Integer.MAX_VALUE);
props.put(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, 120000);
props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 30000);

Defis Majeurs et Solutions

Defi 1 : Gestion des Pics de Charge

Probleme : Black Friday et fins de mois generent des pics de x10 le trafic normal.

Solution : Auto-scaling et buffer :

# Kubernetes HPA pour consumers
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: fraud-consumer-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: fraud-consumer
  minReplicas: 3
  maxReplicas: 30
  metrics:
  - type: External
    external:
      metric:
        name: kafka_consumergroup_lag
        selector:
          matchLabels:
            consumergroup: fraud-detection-group
      target:
        type: AverageValue
        averageValue: "1000"

Defi 2 : Compliance et Audit

Dans un contexte bancaire, chaque message doit etre tracable.

Solution : Audit logging complet :

# Audit logging
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
log4j.logger.kafka.authorizer.logger=INFO, authorizerAppender

# Custom interceptor pour audit
producer.interceptor.classes=com.ca.kafka.audit.AuditProducerInterceptor
consumer.interceptor.classes=com.ca.kafka.audit.AuditConsumerInterceptor
// AuditProducerInterceptor.java
public class AuditProducerInterceptor implements ProducerInterceptor<String, Object> {

    private AuditLogger auditLogger;

    @Override
    public ProducerRecord<String, Object> onSend(ProducerRecord<String, Object> record) {
        auditLogger.log(AuditEvent.builder()
            .action("PRODUCE")
            .topic(record.topic())
            .key(record.key())
            .timestamp(System.currentTimeMillis())
            .principal(SecurityContextHolder.getPrincipal())
            .build());
        return record;
    }
}

Defi 3 : Migration Zero-Downtime

Migrer de Kafka 2.x vers 3.x sans interruption de service.

Strategie adoptee :

Phase 1: Upgrade brokers (rolling restart)
┌────────┐ ┌────────┐ ┌────────┐
│Broker 1│ │Broker 2│ │Broker 3│
│ v2.8   │ │ v2.8   │ │ v2.8   │
└────────┘ └────────┘ └────────┘
    │
    ▼ (restart Broker 1 with v3.0)
┌────────┐ ┌────────┐ ┌────────┐
│Broker 1│ │Broker 2│ │Broker 3│
│ v3.0   │ │ v2.8   │ │ v2.8   │
└────────┘ └────────┘ └────────┘
    ... (repeat for each broker)

Phase 2: Upgrade inter.broker.protocol
Phase 3: Upgrade clients progressivement
Phase 4: Remove deprecated configs

Metriques et KPIs

Dashboard Principal

┌─────────────────────────────────────────────────────────────────┐
│                    KAFKA PLATFORM KPIs                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Availability (SLA: 99.99%)                                     │
│  ████████████████████████████████████████████████░░  99.97%     │
│                                                                  │
│  Messages/Second                                                 │
│  Current: 1.2M/s    Peak: 1.8M/s    Avg: 850K/s                │
│  ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁▂▃▄▅▆▇█▇▆▅▄▃▂▁▂▃▄▅▆▇█                          │
│                                                                  │
│  Consumer Lag (Critical Topics)                                 │
│  fraud.transactions: 120 msgs (OK)                              │
│  payments.orders: 45 msgs (OK)                                  │
│  marketing.events: 15,000 msgs (WARNING)                        │
│                                                                  │
│  Under-Replicated Partitions: 0                                 │
│  Offline Partitions: 0                                          │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

Alertes Critiques Definies

# alerts.yml
groups:
  - name: kafka-critical
    rules:
      - alert: KafkaClusterUnavailable
        expr: sum(up{job="kafka"}) < 2
        for: 1m
        labels:
          severity: critical
          team: platform
        annotations:
          summary: "Kafka cluster has less than 2 brokers available"

      - alert: CriticalConsumerLag
        expr: kafka_consumergroup_lag{topic=~"banking\\.fraud\\..*"} > 10000
        for: 2m
        labels:
          severity: critical
          team: fraud
        annotations:
          summary: "Critical consumer lag on fraud detection pipeline"

Lecons Apprises : Les 10 Commandements

1. La Gouvernance Avant Tout

"Un topic sans owner est un probleme futur"

Chaque topic doit avoir :

  • Un owner identifie
  • Un SLA defini
  • Une politique de retention documentee
  • Un schema enregistre

2. Partitions : Prevoyez Large

# Formule empirique
partitions = max(
  throughput_MB_s * 3,
  max_consumers * 2,
  10  # minimum pour flexibilite future
)

3. Monitoring N'est Pas Optionnel

Metriques critiques a surveiller :
1. Under-replicated partitions (doit etre 0)
2. Consumer lag par groupe
3. Request latency p99
4. ISR shrink rate
5. Disk usage par broker

4. Testez le Disaster Recovery

Nous faisons un DR test mensuel :

  • Failover complet vers le site DR
  • Mesure du RPO/RTO reel
  • Validation des playbooks

5. Documentation Vivante

# Template de documentation topic

## Topic: banking.fraud.transactions.v1

### Description
Flux des transactions bancaires pour detection de fraude en temps reel.

### Owner
Equipe: Fraud Detection
Contact: fraud-team@ca.fr

### SLA
- Latence: < 100ms e2e
- Disponibilite: 99.99%
- Retention: 30 jours

### Schema
Version: 3.2.1
Compatibility: BACKWARD

### Consumers Autorises
- fraud-detection-service
- compliance-audit-service
- analytics-pipeline

A Retenir

Apres 5 ans d'exploitation de Kafka a grande echelle, voici les points essentiels :

Architecture

  • Commencez simple, mais avec une vision long terme
  • La multi-tenancy necessite une gouvernance solide
  • Prevoyez le Disaster Recovery des le debut

Operations

  • Automatisez tout ce qui peut l'etre
  • Le monitoring proactif evite 90% des incidents
  • Les quotas protegent la plateforme entiere

Organisation

  • Une equipe plateforme dediee est indispensable a partir de 10 clusters
  • La formation des equipes utilisatrices reduit les incidents
  • La documentation est un investissement, pas une charge

Performance

  • Le tuning est specifique a chaque cas d'usage
  • Les tests de charge reguliers revelent les limites
  • La compression est votre amie (LZ4 recommande)

Besoin d'Accompagnement ?

Vous souhaitez deployer ou optimiser Kafka dans votre entreprise ? Fort de cette experience en environnement bancaire critique, je propose :

  • Audit de votre infrastructure Kafka existante
  • Accompagnement a la mise en place d'une plateforme enterprise
  • Formation de vos equipes aux bonnes pratiques

Contactez-moi pour un audit gratuit de votre architecture Kafka


Cet article fait partie d'une serie sur Apache Kafka en entreprise. Consultez egalement mes guides sur le monitoring, le tuning de performance, et les patterns d'architecture avances.

F

Florian Courouge

Expert DevOps & Kafka | Consultant freelance specialise dans les architectures distribuees et le streaming de donnees.

Articles similaires