บทความสำหรับเรียนรู้และทดลอง Apache Kafka ตั้งแต่ Producer, Topic, Partition, Broker, Consumer และ Consumer Group

#Apache Kafka คืออะไร

Apache Kafka คือ Distributed Event Streaming Platform สำหรับรับ ส่ง จัดเก็บ และประมวลผลข้อมูลแบบ Event อย่างต่อเนื่อง เหมาะกับระบบที่ต้องรองรับข้อมูลจำนวนมากและต้องการแยกบริการออกจากกันแบบ asynchronous

ตัวอย่าง Event เช่น

  • OrderCreated
  • PaymentCompleted
  • UserRegistered
  • SensorReading
  • ApplicationLog

แทนที่ Service A จะเรียก Service B โดยตรงทุกครั้ง Service A สามารถส่ง Event ไปยัง Kafka แล้วให้ Service อื่นที่สนใจอ่าน Event ไปประมวลผล

#องค์ประกอบสำคัญ

#Producer

โปรแกรมที่ส่ง Event เข้า Kafka

#Broker

Kafka Server ที่รับและจัดเก็บ Event โดย Kafka Cluster สามารถมีหลาย Broker

#Topic

ชื่อช่องทางสำหรับจัดกลุ่ม Event เช่น orders, payments, notifications

#Partition

Topic สามารถแบ่งเป็นหลาย Partition เพื่อเพิ่ม Parallelism และ Throughput การเรียงลำดับ Event รับประกันภายใน Partition เดียว

#Consumer

โปรแกรมที่อ่าน Event จาก Topic

#Consumer Group

กลุ่ม Consumer ที่ร่วมกันประมวลผล Partition ของ Topic ช่วย Scale งานแบบขนาน

#Offset

ตำแหน่งของ Record ภายใน Partition ใช้ติดตามว่า Consumer อ่านข้อมูลถึงตำแหน่งใดแล้ว

#Data Flow

Producer
   |
   v
+-----------------------------+
| Kafka Topic: orders         |
| P0 | P1 | P2                |
+-----------------------------+
   |      |      |
   +------+------+
          |
          v
   Consumer Group
   C1     C2     C3

#ทำไมต้องใช้ Kafka

Kafka เหมาะกับ Event-Driven Architecture, Microservices, Log Aggregation, Data Pipeline, CDC, Real-time Analytics และ Stream Processing

ข้อดีสำคัญคือระบบ Producer และ Consumer ไม่จำเป็นต้องผูกติดกันโดยตรง สามารถเพิ่ม Consumer ใหม่ภายหลังและอ่าน Event ที่ Kafka ยังเก็บรักษาไว้ได้


#Workshop: Kafka ด้วย Docker

Workshop นี้ใช้ Apache Kafka รุ่น 4.x ซึ่งทำงานด้วย KRaft และไม่ต้องพึ่ง ZooKeeper

#1. ตรวจสอบ Docker

docker --version

#2. สร้าง Kafka Container

docker run -d \
  --name kafka \
  -p 9092:9092 \
  apache/kafka:4.3.1

ตรวจสอบ

docker ps
docker logs kafka

#3. สร้าง Topic

สร้าง Topic ชื่อ orders

docker exec kafka \
  /opt/kafka/bin/kafka-topics.sh \
  --create \
  --topic orders \
  --bootstrap-server localhost:9092 \
  --partitions 3 \
  --replication-factor 1

ดูรายการ Topic

docker exec kafka   /opt/kafka/bin/kafka-topics.sh   --list   --bootstrap-server localhost:9092

ดูรายละเอียด

docker exec kafka   /opt/kafka/bin/kafka-topics.sh   --describe   --topic orders   --bootstrap-server localhost:9092

#4. เปิด Producer

docker exec -it kafka   /opt/kafka/bin/kafka-console-producer.sh   --topic orders   --bootstrap-server localhost:9092

ทดลองส่ง

{"orderId":1001,"product":"Keyboard","quantity":1}
{"orderId":1002,"product":"Mouse","quantity":2}
{"orderId":1003,"product":"Monitor","quantity":1}

#5. เปิด Consumer

เปิด Terminal ใหม่

docker exec -it kafka   /opt/kafka/bin/kafka-console-consumer.sh   --topic orders   --bootstrap-server localhost:9092   --from-beginning

Consumer จะได้รับ Event ที่ Producer ส่งเข้า Topic

#6. ทดลอง Consumer Group

docker exec -it kafka   /opt/kafka/bin/kafka-console-consumer.sh   --topic orders   --bootstrap-server localhost:9092   --group order-service

เปิดหลาย Terminal ด้วย Group เดียวกัน แล้วส่ง Event เพิ่ม จะเห็น Kafka กระจาย Partition ให้ Consumer ในกลุ่มเพื่อประมวลผลแบบขนาน

ตรวจสอบ Consumer Group

docker exec kafka   /opt/kafka/bin/kafka-consumer-groups.sh   --bootstrap-server localhost:9092   --describe   --group order-service

ค่าที่ควรรู้ ได้แก่ CURRENT-OFFSET, LOG-END-OFFSET และ LAG

#แนวคิด Event-Driven Microservices

Order Service
      |
      | OrderCreated
      v
+----------------+
| Kafka: orders  |
+----------------+
   |      |      |
   v      v      v
Payment Inventory Notification
Service Service   Service

ข้อดีคือ Order Service ไม่จำเป็นต้องรู้รายละเอียดของบริการปลายทางทั้งหมด แต่ละบริการ Subscribe Event ที่ตนสนใจได้อย่างอิสระ

#Kafka กับ Message Queue ทั่วไป

Kafka เน้น Event Log ที่เก็บข้อมูลตามระยะเวลาและรองรับการอ่านซ้ำ ขณะที่ Message Queue แบบดั้งเดิมมักเน้นส่งงานจาก Producer ไปยัง Consumer เพื่อประมวลผลแล้วจบ Kafka จึงเหมาะมากกับระบบ Event Streaming และระบบที่ Consumer หลายประเภทต้องใช้ Event ชุดเดียวกัน

#สิ่งที่ควรศึกษาต่อ

  • Replication และ Fault Tolerance
  • Message Key และ Partitioning
  • Delivery Semantics
  • Idempotent Producer
  • Transactions
  • Schema Registry / Avro / Protobuf
  • Kafka Connect
  • Kafka Streams
  • Dead Letter Topic
  • Security: TLS, SASL และ ACL
  • Monitoring และ Consumer Lag

#สรุป

โครงสร้างหลักที่ควรจำคือ

Producer -> Topic -> Partition -> Broker -> Consumer Group -> Consumer

Kafka ช่วยให้ระบบรองรับ Event จำนวนมาก ขยายแบบแนวนอนได้ และลด coupling ระหว่าง Microservices จึงเป็นโครงสร้างพื้นฐานสำคัญของ Event-Driven Architecture และ Real-time Data Platform

#อ้างอิง