แนวคิด Log Abstraction
ไอเดียในหนึ่งประโยค
หัวข้อที่มีชื่อว่า “ไอเดียในหนึ่งประโยค”ทุกอย่างที่ Kafka ทำวางอยู่บน data structure เดียว คือ log แบบ append-only ที่มีลำดับสมบูรณ์ ซึ่ง record แต่ละตัวได้ offset ที่เพิ่มขึ้นเรื่อย ๆ และการอ่านก็แค่ scan เริ่มจาก offset จุดหนึ่ง
จริง ๆ แล้ว log คืออะไร
หัวข้อที่มีชื่อว่า “จริง ๆ แล้ว log คืออะไร”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 เดียวกันด้วยความเร็วต่างกัน
# Read a topic from the very beginning — replaying all retained historykafka-console-consumer.sh --bootstrap-server localhost:9092 \ --topic orders --from-beginningflowchart 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)"] ลำดับเป็นแบบต่อ log
หัวข้อที่มีชื่อว่า “ลำดับเป็นแบบต่อ log”log อันเดียวให้ ลำดับสมบูรณ์ คือ offset 4 มาหลัง offset 3 เสมอ guarantee เรื่องลำดับนี้เป็นรากฐานของความถูกต้อง แต่เป็นจริง ภายใน partition เดียว ไม่ใช่ทั้ง topic module ถัดไปจะแกะความต่างตรงนี้ให้ เพราะกำหนดวิธีที่คุณออกแบบ key และ scale throughput ตอนนี้ขอแค่จำไอเดียหลักไว้ log มีลำดับ, append-only และอ่านตามตำแหน่ง