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

แนวคิด Log Abstraction

ทุกอย่างที่ Kafka ทำวางอยู่บน data structure เดียว คือ log แบบ append-only ที่มีลำดับสมบูรณ์ ซึ่ง record แต่ละตัวได้ offset ที่เพิ่มขึ้นเรื่อย ๆ และการอ่านก็แค่ scan เริ่มจาก offset จุดหนึ่ง

log ของ Kafka ไม่ใช่ไฟล์ text ที่มีบรรทัด debug แต่เป็น sequence ของ record ที่เรียงลำดับและแก้ไม่ได้ record ใหม่ถูก append ไปท้าย record เดิมไม่เคยถูกแก้ตรงที่เดิม record แต่ละตัวได้ offset จำนวนเต็มตัวถัดไป

offset: 0 1 2 3 4 5 → (append here)
record: [ev0] [ev1] [ev2] [ev3] [ev4] [ev5]
a consumer reading from offset 2

เพราะการเขียนไปลงท้ายเสมอ Kafka เลยเปลี่ยนการเก็บ message ให้กลายเป็น sequential disk I/O ซึ่งเร็วกว่า random I/O ที่ store แบบแก้ค่าได้ต้องใช้อย่างมาก ไม่มีการ update ตรงที่เดิม ไม่ต้องหา page มาเขียนทับ มีแค่ append แล้วเลื่อนไปข้างหน้า

consumer อ่านด้วยการบอกว่า “ขอ record เริ่มจาก offset N” แล้ว Kafka ก็ stream ให้ตามลำดับ offset ของ consumer คือ cursor ที่คุมเอง ไม่ใช่สิ่งที่ broker ไปแก้ตอนส่ง นี่แหละคือกลไกทั้งหมด

  • เลื่อน cursor ถอยหลัง เพื่อ replay ประมวลผล event ของเมื่อวานใหม่หลังแก้ bug เสร็จ
  • เลื่อน ไปข้างหน้า เพื่อข้าม
  • มี cursor สองอัน (consumer group สองตัว) อ่าน log เดียวกันด้วยความเร็วต่างกัน
Terminal window
# Read a topic from the very beginning — replaying all retained history
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--topic orders --from-beginning
flowchart LR
  prod["Producer"] -->|append| tail["log tail (next offset)"]
  subgraph log["Partition log: offsets 0..N"]
    tail
  end
  log --> curA["Group A cursor at offset 40"]
  log --> curB["Group B cursor at offset 12 (replaying)"]
append ที่ท้าย consumer แต่ละตัวถือ cursor อ่านของตัวเอง

log อันเดียวให้ ลำดับสมบูรณ์ คือ offset 4 มาหลัง offset 3 เสมอ guarantee เรื่องลำดับนี้เป็นรากฐานของความถูกต้อง แต่เป็นจริง ภายใน partition เดียว ไม่ใช่ทั้ง topic module ถัดไปจะแกะความต่างตรงนี้ให้ เพราะกำหนดวิธีที่คุณออกแบบ key และ scale throughput ตอนนี้ขอแค่จำไอเดียหลักไว้ log มีลำดับ, append-only และอ่านตามตำแหน่ง

ทำไมการเขียนของ Kafka ถึงเร็ว
เกิดอะไรขึ้นกับ record เมื่อ consumer อ่านไปแล้ว
replay ใน Kafka ทำงานยังไง
log อันเดียวของ Kafka ให้ ordering guarantee แบบไหน