Apache Kafka
Event-driven messaging สำหรับ microservices — order events, price feeds, trade reconciliation
What I Can Do
- ออกแบบ topic structure และ partition strategy สำหรับ trading platform
- Produce/consume messages ด้วย Go (segmentio/kafka-go, confluent-kafka-go)
- จัดการ consumer group, offset management, rebalancing
- Monitor lag และ troubleshoot consumer issues
- Design dead letter queue สำหรับ failed messages
Commands I Use Daily
# list ทุก topics
kafka-topics.sh --bootstrap-server localhost:9092 --list
# สร้าง topic ใหม่
kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic trading.orders.created \
--partitions 6 --replication-factor 3
# ดู consumer group lag — ใช้ตรวจว่า consumer ตามทันไหม
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group order-processor
# consume messages แบบ real-time (debug)
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic trading.orders.created --from-beginning --max-messages 10
# ดู/แก้ config เช่น retention period
kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type topics --entity-name trading.orders.created \
--add-config retention.ms=604800000 # 7 daysMessage Broker คืออะไร
Message broker เป็น middleware ที่รับ-ส่ง messages ระหว่าง services — producer ส่ง message เข้า broker, consumer อ่าน message ออกมา ทำให้ services ไม่ต้อง call หากันโดยตรง (decoupling)
Pub/Sub Model
Publisher ส่ง messages ไปที่ topic, subscribers ที่สนใจ topic นั้นจะได้รับ messages — ต่างจาก point-to-point ที่ส่งหา receiver โดยตรง Kafka ใช้ pull-based model คือ consumer ดึง messages เอง
Topic & Partition
- Topic = logical channel สำหรับ messages ประเภทเดียวกัน เช่น
trading.orders.created - Partition = unit of parallelism ภายใน topic — แต่ละ partition เป็น ordered, immutable log
- จำนวน partitions กำหนด max parallelism ของ consumers
Producer & Consumer Basics
- Producer ส่ง messages ไปที่ topic — ระบุ topic + optional key + value
- Consumer อ่าน messages จาก topic — subscribe แล้ว poll messages มา process
Offset
Offset คือ sequential ID ของ message ภายใน partition — consumer track offset เพื่อรู้ว่าอ่านถึงไหนแล้ว เมื่อ restart จะ resume จาก committed offset
Consumer Group
กลุ่มของ consumers ที่ทำงานร่วมกัน — Kafka assign partitions ให้แต่ละ consumer ใน group ไม่ซ้ำกัน ทำให้ scale consumption ได้โดยเพิ่ม consumers (แต่ไม่เกินจำนวน partitions)
Partitioning Strategy
เลือก partition key ให้เหมาะกับ use case — same key ไปที่ same partition เสมอ ถ้าต้องการ ordering ใช้ entity ID เป็น key (เช่น order_id) ถ้าต้องการ distribution ใช้ random หรือ round-robin
Message Key & Ordering
Kafka guarantee ordering ภายใน partition เดียวเท่านั้น — ถ้าต้องการ messages ของ entity เดียวกันเรียงตามลำดับ ต้องใช้ entity ID เป็น key เพื่อให้ไปที่ partition เดียวกัน
Replication Factor
แต่ละ partition มี replicas กระจายอยู่บนหลาย brokers — replication factor 3 หมายความว่ามี 3 copies ถ้า broker ตัวหนึ่ง down ยัง serve ได้จาก replica อื่น
Acknowledgment (acks)
acks=0— producer ไม่รอ confirmation (เร็วสุด, อาจ lose messages)acks=1— รอ leader confirm (balanced)acks=all— รอทุก replicas confirm (ช้าสุด, safest)
Consumer Rebalancing
เมื่อ consumer เข้า/ออกจาก group, Kafka reassign partitions — ระหว่าง rebalance ไม่มีการ consume ใช้ session.timeout.ms และ heartbeat.interval.ms ควบคุม detection speed
Dead Letter Queue
Messages ที่ process fail หลาย attempts จะถูกส่งไป DLQ topic แทนที่จะ block consumer — ทำให้ main consumption ไม่ติดขัด สามารถ inspect และ retry messages ใน DLQ ทีหลัง
Exactly-once Semantics
Kafka รองรับ exactly-once processing ด้วย combination ของ idempotent producer + transactions + consumer read_committed isolation — ป้องกัน duplicate processing
Idempotent Producer
Enable enable.idempotence=true ทำให้ producer ส่ง message ซ้ำได้โดย Kafka deduplicate ให้ — ป้องกัน duplicate messages จาก network retry
Transaction API
Producer สามารถ send messages แบบ atomic (all-or-nothing) ข้าม multiple topics/partitions — ใช้สำหรับ consume-transform-produce pattern เพื่อ guarantee exactly-once
Consumer Lag Monitoring
ติดตาม lag (offset ล่าสุด - committed offset ของ consumer) — lag ที่เพิ่มขึ้นเรื่อยๆ หมายความว่า consumer process ไม่ทัน ต้อง scale out หรือ optimize processing
Retention & Compaction
- Time-based retention — ลบ messages เก่ากว่า X วัน (
retention.ms) - Log compaction — เก็บแค่ latest value ของแต่ละ key, ใช้สำหรับ changelog topics
Schema Evolution (Avro/Protobuf)
ใช้ Schema Registry + Avro/Protobuf เพื่อ enforce message schema — รองรับ backward/forward compatible evolution โดย producer/consumer ไม่ต้อง deploy พร้อมกัน
Kafka Connect
Framework สำหรับ stream data เข้า/ออก Kafka โดยไม่ต้องเขียน code — source connectors (DB → Kafka), sink connectors (Kafka → DB/S3/Elasticsearch)
Related Skills
- Go — ภาษาที่ใช้เขียน Kafka producer/consumer
- Docker — run Kafka cluster ใน development
- PostgreSQL — consume events แล้วเขียนลง database