01Topic, Partition และ Offset
Topic แบ่งเป็นหลาย partition แต่ละ partition เป็น log ที่เรียงลำดับและมี offset เพิ่มต่อเนื่อง Producer เลือก partition จาก key หรือ partitioner ส่วน consumer อ่านตาม offset ของตัวเอง ทำให้ข้อมูลเดียวกัน replay ได้โดยไม่ต้องย้ายออกจาก log หลังอ่าน
Consumer group กระจาย partition ให้สมาชิก โดยหนึ่ง partition ถูกอ่านโดย consumer เดียวต่อ group ณ เวลาใดเวลาหนึ่ง ดังนั้นจำนวน consumer ที่มากกว่าจำนวน partition จะมีสมาชิกว่าง และ partition count เป็นเพดาน parallelism ของ group
02Ordering และ Partition Key
Kafka รับประกันลำดับ ภายใน partition ไม่ใช่ทั้ง topic หาก event ของ policy เดียวกันต้องเรียง ให้ใช้ `policyId` เป็น key เพื่อไป partition เดียวกัน แต่ key ที่กระจายไม่ดี เช่น tenant ใหญ่รายเดียว อาจสร้าง hot partition
Schema ของ event เป็น public contract ควรมี versioning และ compatibility rule เพิ่ม field แบบ optional ได้ง่ายกว่าการเปลี่ยนความหมาย field เดิม Producer ไม่ควรผูก consumer ทุกตัวให้ deploy พร้อมกัน
03Delivery Semantics และ Idempotency
At-most-once
Commit ก่อน process มีโอกาสเสียข้อความ แต่ไม่ process ซ้ำ
At-least-once
Process แล้ว commit มีโอกาสซ้ำเมื่อ crash จึงต้อง idempotent
Exactly-once
ต้องกำหนดขอบเขตให้ชัด Kafka transaction ไม่ทำให้ external DB atomic โดยอัตโนมัติ
Idempotent producer ป้องกัน duplicate จาก producer retry ภายใน session ส่วน consumer ที่เขียน database ควรใช้ event ID กับ unique constraint หรือ inbox table เพื่อกันการ apply event ซ้ำ สำหรับ dual write จาก DB ไป Kafka ใช้ transactional outbox แล้ว publish ภายหลัง
04Lag, Rebalance และ Backpressure
Consumer lag คือระยะระหว่าง latest offset กับ offset ที่ group ประมวลผลแล้ว Lag สูงอาจเกิดจาก consumer ช้า, partition skew, downstream ช้า หรือ rebalance บ่อย ต้องดู rate ของ lag ไม่ใช่แค่ตัวเลขจุดเดียว
- ตั้ง retention จากเวลาที่ต้อง replay ไม่ใช่พื้นที่ว่างแบบเดาสุ่ม
- จำกัด batch และ processing time ให้สัมพันธ์กับ poll/heartbeat configuration
- มี dead-letter strategy แต่เก็บเหตุผล, original payload และ replay tooling
- Monitor under-replicated partitions, produce/fetch latency และ disk utilization