Kafka คืออะไร
ไอเดียในหนึ่งประโยค
หัวข้อที่มีชื่อว่า “ไอเดียในหนึ่งประโยค”Kafka คือ log แบบ distributed, append-only ที่แยกระบบฝั่งที่ผลิตข้อมูลออกจากระบบฝั่งที่บริโภคข้อมูล producer เขียน event ครั้งเดียว แล้ว consumer อิสระกี่ตัวก็ได้อ่าน event นั้นตามลำดับ ตามจังหวะของแต่ละตัวเอง
ไม่ใช่ queue แต่เป็น log
หัวข้อที่มีชื่อว่า “ไม่ใช่ queue แต่เป็น log”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"]
ทำไมไม่ใช้ database ไปเลย
หัวข้อที่มีชื่อว่า “ทำไมไม่ใช้ database ไปเลย”คุณ อาจจะ 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