บทความสำหรับเรียนรู้และทดลอง Apache Kafka ตั้งแต่ Producer, Topic, Partition, Broker, Consumer และ Consumer Group
#Apache Kafka คืออะไร
Apache Kafka คือ Distributed Event Streaming Platform สำหรับรับ ส่ง จัดเก็บ และประมวลผลข้อมูลแบบ Event อย่างต่อเนื่อง เหมาะกับระบบที่ต้องรองรับข้อมูลจำนวนมากและต้องการแยกบริการออกจากกันแบบ asynchronous
ตัวอย่าง Event เช่น
OrderCreatedPaymentCompletedUserRegisteredSensorReadingApplicationLog
แทนที่ 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
#อ้างอิง
- Apache Kafka Documentation: https://kafka.apache.org/
- Apache Kafka Quickstart: https://kafka.apache.org/quickstart/