อัปเดต_2024-11-13
- ในรายงานฉบับแรกมีการอ้างว่าคอนซูเมอร์ที่เปิดใช้ auto-commit จะคอมมิตออฟเซ็ตที่ถูกส่งกลับมาจาก poll ล่าสุดโดยอัตโนมัติ จนอาจทำให้เกิดการสูญหายของข้อมูลได้
- อย่างไรก็ตาม ผู้อ่านหลายคนโต้แย้งว่าคอนซูเมอร์แบบ auto-commit แท้จริงแล้วคอมมิตออฟเซ็ตของ poll ก่อนหน้า ไม่ใช่ poll ล่าสุด
- ผลการทดลองกับ Java Kafka client ก็สนับสนุนข้อโต้แย้งนี้ และแต่ละไคลเอนต์อาจทำงานแตกต่างกันได้
- ได้ลบข้ออ้างเฉพาะเกี่ยวกับ auto-commit ออกจากรายงานแล้ว และยังต้องมีการศึกษาเพิ่มเติม
พื้นหลัง
- Kafka เป็นระบบสตรีมมิงยอดนิยมที่มีการทำ replication, sharding และ append-only log
- Bufstream เป็นทางเลือกแทน Kafka ที่ให้ความสำคัญกับ data governance และความคุ้มค่าด้านต้นทุนในสภาพแวดล้อมคลาวด์
- เช่นเดียวกับ Kafka, Bufstream มีชุดของล็อกที่เรียงลำดับบางส่วนซึ่งเรียกว่า topic และแต่ละ topic ถูกแบ่งออกเป็น partition
- Bufstream เข้ากันได้กับ Kafka client มาตรฐาน และประกอบด้วย agent ซึ่งเป็นบริการแบบ stateless ที่ให้ Kafka API, object store สำหรับเก็บข้อมูล และ coordination service
- Bufstream ลดต้นทุนด้วยการเขียนข้อมูลลงบริการ object storage โดยตรง และสามารถรันบน VM แบบ stateless ที่ขยายอัตโนมัติได้
ความปลอดภัยของไคลเอนต์
- Bufstream ถูกออกแบบมาสำหรับแอปพลิเคชันสตรีมมิงหลากหลายประเภท และตั้งค่าตัวเลือกการกำหนดค่าของไคลเอนต์หลายอย่างเพื่อให้ทำงานได้อย่างปลอดภัย
- เช่นเดียวกับ Kafka, ใช้
acks = all เป็นค่าเริ่มต้น และตั้ง enable.auto.commit = false เพื่อป้องกันการสูญหายของข้อมูล
- ใช้
auto.offset.reset = earliest เพื่อให้คอนซูเมอร์สามารถสังเกตเห็นล็อกทั้งหมดได้
ธุรกรรม
- Bufstream รองรับระบบธุรกรรมของ Kafka และให้ atomicity ในรูปแบบที่อ่อนกว่าผ่านการตั้งค่าที่ซับซ้อน
- คอนซูเมอร์สามารถทำงานที่ระดับการแยก
read_uncommitted หรือ read_committed ได้ และ read_committed ป้องกันปรากฏการณ์บางอย่าง (G1a, G1c)
- ทั้ง Kafka, Redpanda และ Bufstream ต่างก็เกิดปรากฏการณ์ G0 ซึ่งไม่สอดคล้องกับระดับการแยกที่มีการระบุไว้ในเอกสาร
การออกแบบการทดสอบ
- ทดสอบตั้งแต่ Bufstream 0.1.0 ถึง 0.1.3 โดยใช้ไลบรารีทดสอบ Jepsen และ Java Kafka Client
- การทดสอบประเมินความปลอดภัยของ Bufstream ด้วยการฉีดความขัดข้องหลากหลายรูปแบบ
คิว
- ออกแบบ workload แบบคิวให้สอดคล้องกับโมเดลข้อมูลของ Kafka และนำมาใช้กับ Bufstream
- แต่ละ logical process จะรันไคลเอนต์ producer, consumer และ admin พร้อมส่งเรคอร์ดสำหรับคีย์ที่หลากหลาย
การยกเลิก
- จากผลลัพธ์ที่ไม่คาดคิด ได้ออกแบบ workload เพื่อติดตามการยกเลิกธุรกรรมและออฟเซ็ต
- ออฟเซ็ตหลังธุรกรรมที่ถูกยกเลิกถูกจัดเป็น 4 หมวด: เดินหน้า, ย้อนกลับ, ย้อนกลับมากขึ้น, อื่นๆ
ผลลัพธ์ของ Bufstream
คอนซูเมอร์ค้าง (#1)
- ตั้งแต่ 0.1.0 ถึง 0.1.3-rc.8 พบปัญหาที่
consumer.poll() คืนค่าทันทีแต่ไม่คืนเรคอร์ดใดๆ
- Bufstream แก้ปัญหานี้ใน 0.1.3-rc.6 ด้วยการรีเฟรชแคช
โปรดิวเซอร์และคอนซูเมอร์ค้าง (#2)
- แม้ใน 0.1.3-rc.6 ก็ยังพบปัญหาที่การเรียก
InitProducerId ล้มเหลว หรือการเรียก listOffsets ล้มเหลว
- Bufstream แก้ปัญหานี้ด้วยการเพิ่ม logic การ polling เพิ่มเติม
ออฟเซ็ต 0 ที่ไม่ถูกต้อง (#3)
- ตั้งแต่ 0.1.0 ถึง 0.1.3-rc.2 พบปัญหาที่มีการกำหนดออฟเซ็ต 0 อย่างไม่ถูกต้อง
- Bufstream แก้ปัญหานี้ใน 0.1.3-rc.6
การสูญหายของการเขียนในธุรกรรม (#4)
- ใน 0.1.2 พบปัญหาที่เรคอร์ดของธุรกรรมที่คอมมิตแล้วหายไป
- Bufstream แก้ปัญหานี้ใน 0.1.3-rc2
การสูญหายของการเขียนจากการกรองฝั่งเซิร์ฟเวอร์ (#5)
- ใน 0.1.3-rc.8 เกิดการสูญหายของการเขียนเมื่อระบบตอบสนองต่อความขัดข้องเล็กน้อย
- Bufstream แก้ปัญหานี้ใน 0.1.3-rc.12
ผลลัพธ์ของ Kafka
ข้อความผิดพลาดที่ทำให้เข้าใจผิด (KIP-588)
- มีปัญหาที่
ProducerFencedException เกิดขึ้นได้แม้ในกรณี transaction timeout
- แนะนำให้ทีม Kafka เปลี่ยนข้อความผิดพลาด
ความเป็นไปได้ที่จะรอไม่สิ้นสุดเมื่อปิดคอนซูเมอร์ (KAFKA-17734)
- มีปัญหาที่การเรียก
Consumer.close() อาจรอไม่สิ้นสุดใน network IO
- ติดตามปัญหานี้ผ่าน KAFKA-17734
ออฟเซ็ตของคอนซูเมอร์ที่คาดเดาไม่ได้หลังธุรกรรมล้มเหลว (KAFKA-17582)
- ยังขาดเอกสารเกี่ยวกับพฤติกรรมที่ตั้งใจไว้ของออฟเซ็ตคอนซูเมอร์เมื่อธุรกรรมล้มเหลว
- คอนซูเมอร์อาจย้อนออฟเซ็ตกลับหรือเดินหน้าต่อหลังธุรกรรมที่ถูกยกเลิกได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ระหว่างตรวจสอบปัญหาที่เกิดขึ้นใน Kafka มีการพบการเขียนที่มองไม่เห็น ซึ่งชี้ให้เห็นว่าข้อความ Produce ที่ล่าช้าอาจถูกรวมเข้าไปในทรานแซกชันในอนาคตและละเมิดการรับประกันของทรานแซกชันได้ นอกจากนี้ยังมีข้อสงสัยว่า Kafka Java Client อาจนำหมายเลขลำดับกลับมาใช้ซ้ำได้เมื่อคำขอหมดเวลา ต้องมีการทดสอบ Kafka เพิ่มเติม
เมื่อดูหน้าผลิตภัณฑ์ของ Bufstream ก็สงสัยว่าคำกล่าวสองข้อนี้สอดคล้องกันได้อย่างไร
รู้สึกแปลกใจกับฟีเจอร์ auto-commit ของ Kafka
โปรโตคอลทรานแซกชันของ Kafka มีปัญหาในระดับพื้นฐานและจำเป็นต้องแก้ไข
สงสัยว่า Kyle เคยตรวจดู NATS Jetstream หรือไม่
หาโปรเจกต์ GitHub ของ bufstream ไม่เจอ สงสัยว่ามีเบาะแสอะไรไหม
หลังจากอ่านบล็อกโพสต์และเอกสารที่เกี่ยวข้อง Kafka นิยาม "ส่งมอบแบบ exactly once" ว่าเป็นคุณสมบัติของ "งานอ่าน-ประมวลผล-เขียน" ซึ่งดูเหมือนว่าจะอธิบายว่าเป็นทรานแซกชันจะเหมาะกว่า
วลี "ทรานแซกชันสามารถถูกสังเกตได้บางส่วนหรือทั้งหมด" น่าจะควรอ่านเป็น "consumer สามารถสังเกตได้บางส่วนหรือทั้งหมด"
สงสัยว่าซอฟต์แวร์นี้ใช้ทำอะไร การวัดผล? กล่องดำ?