ข้ามไปยังเนื้อหา

Kafka คืออะไร

Kafka คือ log แบบ distributed, append-only ที่แยกระบบฝั่งที่ผลิตข้อมูลออกจากระบบฝั่งที่บริโภคข้อมูล producer เขียน event ครั้งเดียว แล้ว consumer อิสระกี่ตัวก็ได้อ่าน event นั้นตามลำดับ ตามจังหวะของแต่ละตัวเอง

message queue แบบเดิม ลบ message ทิ้งทันทีที่ consumer ack แล้ว มี reader เชิงตรรกะแค่ตัวเดียว และ message หายไปหลังส่งเสร็จ Kafka ต่างออกไป เป็น log เมื่อ producer เขียน record เข้ามา Kafka จะ append record นั้นเข้า partition แล้วเก็บไว้ตาม retention period ที่ตั้งไว้ การอ่าน record ไม่ได้ ทำให้ record หายไป consumer แต่ละตัว track ตำแหน่งของตัวเอง (คือ offset) ใน log ดังนั้นสองทีมอ่าน stream เดียวกันเพื่อจุดประสงค์คนละอย่างได้เลยโดยไม่กวนกัน

การตัดสินใจออกแบบข้อเดียวนี้แหละ คือเหตุผลที่ Kafka ถูกใช้ทำหลายอย่างพร้อมกัน

  • Messaging แยก service ออกจากกันด้วย buffer ที่ทนทานคั่นกลาง
  • Event sourcing ตัว log คือ source of truth ส่วน state เป็นแค่ projection ของตัวเอง
  • Stream processing transform และ join stream ตอนที่ข้อมูลไหลเข้ามา
  • Data integration pipeline เดียวป้อนข้อมูลให้ database, search index และ warehouse
flowchart LR
  p1["Producer: orders service"] --> log["Topic (append-only log)"]
  p2["Producer: payments service"] --> log
  log --> c1["Consumer group: fraud detection"]
  log --> c2["Consumer group: analytics"]
  log --> c3["Consumer group: email notifications"]
producer เขียนครั้งเดียว consumer อิสระอ่านที่ offset ของตัวเอง

คุณ อาจจะ poll ตาราง database เพื่อหา row ใหม่ก็ได้ แต่นั่นคือการสร้าง Kafka ขึ้นมาใหม่แบบห่วย ๆ ไม่มี ordering guarantee ต่อ key ในตัว, ไม่มี fan-out ไปหา reader หลายตัวอย่างมีประสิทธิภาพ, ไม่มี back-pressure, replay จากจุดใดก็ได้ไม่ได้ และ scale throughput ตามแนวนอนไม่ได้ Kafka ถูกออกแบบมาเพื่อ event stream ที่ throughput สูง, มีลำดับ และ replay ได้ โดยเฉพาะ ทั้งการเขียนดิสก์แบบ sequential, การอ่านแบบ zero-copy และ partitioning ที่ scale การอ่านเขียนกระจายทั้ง cluster

คุณจะเจอศัพท์พวกนี้ตลอด เลยต้องปักหมุดไว้ตั้งแต่ตอนนี้

  • Broker เซิร์ฟเวอร์ Kafka หนึ่งตัว ส่วน cluster คือ broker หลายตัวรวมกัน
  • Topic stream ของ record ที่มีชื่อ (เช่น orders) เชิงตรรกะคือ log หนึ่งอัน
  • Partition topic ถูกแบ่งเป็น partition แต่ละ partition คือ log ที่มีลำดับจริง ๆ
  • Offset ตำแหน่งของ record ภายใน partition consumer track offset เพื่อรู้ว่าตัวเองอ่านถึงไหนแล้ว
  • Producer / Consumer client ที่เขียนเข้าและอ่านออกจาก topic
Kafka ต่างจาก message queue แบบเดิมยังไง
offset แทนอะไร
ทำไมสองทีมอ่าน Kafka topic เดียวกันได้โดยไม่กวนกัน
ข้อไหน NOT ใช่ use case ทั่วไปของ Kafka