- การพูดคุยเรื่อง Kafka ที่ปรับให้เหมาะกับคลาวด์ กำลังคึกคักมากขึ้นผ่าน KIP-1150 (Kafka แบบไม่มีดิสก์) และโปรเจกต์ Kafka fork ของ AutoMQ
- หากสร้าง Kafka ขึ้นมาใหม่อีกครั้ง มีข้อเสนอให้ ตัดโครงสร้างพาร์ทิชันแบบเดิมออก และใช้ แนวทางที่ยึดคีย์เป็นศูนย์กลาง
- มีความต้องการฟีเจอร์ การควบคุมการทำงานพร้อมกัน และ การรองรับสคีมาที่ฝั่งโบรกเกอร์
- ยังเน้นย้ำถึงความจำเป็นในการผสานคุณลักษณะของระบบสมัยใหม่อย่าง ความสามารถในการขยายตัว, snapshot, multi-tenancy
- เป็นการจินตนาการถึง ระบบ event log แบบ cloud-native ที่แท้จริง ซึ่งต่อยอดจาก Kafka และก้าวข้ามข้อจำกัดของ Kafka เดิม
ถ้าจะสร้าง Kafka ขึ้นมาใหม่?
- ไม่นานมานี้มีการประกาศ KIP-1150 (Kafka แบบไม่มีดิสก์) และ Kafka fork ของ AutoMQ ซึ่งมีเป้าหมายเพื่อผสาน Kafka เข้ากับ object storage อย่าง S3 เพื่อเพิ่มความยืดหยุ่นและลดต้นทุนในสภาพแวดล้อมคลาวด์
- บทความนี้จินตนาการถึง ระบบ event log แบบ cloud-native ที่ก้าวข้ามข้อจำกัดของ Kafka แบบเดิม พร้อมเสนอแนวทางปรับปรุงหลากหลายด้าน
ข้อเสนอเรื่องสถาปัตยกรรมแบบไม่มีพาร์ทิชัน
- เนื่องจาก object storage บนคลาวด์สามารถทำงานได้เสมือนเป็นสตอเรจไม่จำกัด ความจำเป็นของ topic partition จึงลดลง
- หลายกรณีสิ่งสำคัญมีเพียงลำดับข้อความแบบ global หรือเฉพาะลำดับของข้อความที่มีคีย์เดียวกัน
- สามารถซ่อนแนวคิดเรื่องพาร์ทิชันจากผู้ใช้และมอบประสบการณ์การใช้งานที่เรียบง่ายขึ้นได้
แนวทางที่ยึดคีย์เป็นศูนย์กลาง
- เสนอการออกแบบที่ทำให้เข้าถึงและ replay ข้อความทั้งหมดของคีย์ใดคีย์หนึ่ง ได้อย่างรวดเร็ว แทนการสแกนพาร์ทิชัน
- รองรับสตรีมระดับเอนทิตีนับล้านรายการ ทำให้ปรับจำนวน consumer ได้อย่างยืดหยุ่นตามความต้องการ
- เมื่อความล้มเหลวถูกแยกในระดับคีย์ ประสิทธิภาพการประมวลผลโดยรวมของระบบก็เพิ่มขึ้น
- เป็นโครงสร้างที่เหมาะอย่างยิ่งกับ event sourcing หรือ ระบบ actor model
รองรับโครงสร้างลำดับชั้นของท็อปปิก
- ควรยกระดับบางส่วนของ message payload ให้กลายเป็นตัวระบุท็อปปิกในรูปแบบเส้นทางที่มีโครงสร้าง เช่นเดียวกับระบบอย่าง Solace เพื่อรองรับการ subscribe แบบอิงแพตเทิร์น
- โบรกเกอร์จะสามารถรองรับการกรอง subscription ได้อย่างมีประสิทธิภาพโดยไม่ต้อง parse ข้อความทั้งหมด
ความสามารถด้านการควบคุมการทำงานพร้อมกัน
- ปัจจุบัน Kafka ยังไม่มีวิธีป้องกันการชนกันของงานพร้อมกันในขณะเขียนข้อมูล
- หากรองรับ optimistic locking แยกตามคีย์ ก็จะสามารถตรวจสอบได้ว่าข้อความถูกเขียนหลังจากเห็นสถานะล่าสุดแล้วหรือไม่
- ซึ่งช่วยป้องกันปัญหา lost update ได้
การรองรับสคีมาที่ฝั่งโบรกเกอร์
- ปัจจุบัน Kafka ปฏิบัติต่อข้อความเป็นเพียงอาร์เรย์ของไบต์ จึงต้องพึ่งพา external schema registry
- มีข้อเสนอว่าควรรองรับข้อมูลสคีมาอย่าง AsyncAPI metadata เป็นพื้นฐานในระดับโบรกเกอร์ เพื่อให้เกิด ความสอดคล้องของสคีมา
- แนวทางนี้ยังช่วยให้เชื่อมต่อกับ open table format อย่าง Apache Iceberg ได้ง่ายขึ้น
ความสามารถในการขยายตัวและโครงสร้างปลั๊กอิน
- มีข้อเสนอให้ใช้โครงสร้างที่มี ความสามารถในการขยายตัว และ รองรับปลั๊กอิน ได้เหมือน Postgres หรือ Kubernetes
- ควรทำให้สามารถสร้างตัวกรองหรือการแปลงข้อมูลที่ระดับโบรกเกอร์ได้ง่าย โดยไม่ต้องมี protocol-aware proxy (เช่น Kroxylicious)
- ฟีเจอร์อย่าง rate limiting, การเข้ารหัสท็อปปิก, และการรองรับแบ็กเอนด์ที่ใช้ตาราง Iceberg ควรถูกทำเป็นปลั๊กอินได้
synchronous commit callback
- ปัจจุบัน Kafka รับประกันได้เพียง eventual consistency
- มีข้อเสนอว่าควรมีโครงสร้างที่ทำให้ producer ตรวจสอบได้ทันทีหลังส่งข้อความว่า ข้อมูลอนุพันธ์ที่เกี่ยวข้องถูกอัปเดตแล้วหรือยัง
- รองรับ read-your-own-writes เพื่อให้ Kafka ถูกใช้เป็น database log ที่แท้จริงได้
ฟีเจอร์ snapshot
- ปัจจุบัน compaction ของ Kafka จะเก็บไว้เพียงข้อความล่าสุดเท่านั้น ซึ่งใช้ได้ก็ต่อเมื่อข้อความนั้นมีสถานะทั้งหมดอยู่ครบ
- หากบันทึกเฉพาะการเปลี่ยนแปลง ก็จำเป็นต้อง replay event ทั้งหมดของแต่ละคีย์ ทำให้ใช้เวลามากขึ้น
- จึงจำเป็นต้องมีฟังก์ชัน logical compaction ที่สรุป event ตามคีย์ให้อยู่ในรูป snapshot
รองรับ multi-tenancy เป็นพื้นฐาน
- ระบบข้อมูลสมัยใหม่ทุกระบบควรออกแบบโดยคำนึงถึง multi-tenancy เป็นพื้นฐาน
- ควรทำให้สามารถสร้างสภาพแวดล้อมสำหรับ tenant ใหม่ได้ทันทีและมีต้นทุนต่ำ พร้อมแยกทรัพยากร ความปลอดภัย และการควบคุมการเข้าถึงออกจากกันอย่างชัดเจน
หมายเหตุเพิ่มเติม
- บางฟีเจอร์มีในระบบอื่นอยู่แล้ว เช่น S2 (high-cardinality stream), Waltz (optimistic locking), และ Apache Pulsar (multi-tenancy)
- แต่ยังไม่มีระบบโอเพนซอร์สที่รองรับทุกฟีเจอร์ที่เสนอมาเหล่านี้พร้อมกัน
- บทความนี้เป็นความเห็นส่วนตัวของผู้เขียนที่สังกัด Confluent และไม่ใช่จุดยืนอย่างเป็นทางการ
- มีการกล่าวด้วยว่า ในเชิงทฤษฎีสถาปัตยกรรมแบบ LSM tree-based น่าจะเป็นตัวเลือกที่มีแนวโน้มมากที่สุด
2 ความคิดเห็น
เราเรียกสิ่งนั้นว่า Redis อยู่แล้ว
ความเห็นจาก Hacker News
เห็นด้วย คุ้มค่าที่จะแก้ปัญหา head-of-line สำหรับบาง use case
NATS.io ใช้งานง่ายกว่า Kafka และได้แก้หลายจุดไปแล้ว เช่น การตัดพาร์ทิชันออก การรองรับสตรีมแบบอิงคีย์ และโครงสร้างลำดับชั้นของหัวข้อที่ยืดหยุ่น
เส้นทางที่เจอกับ Kafka ก็คล้ายกันเป็นส่วนใหญ่
สำหรับบาง use case จะมีประโยชน์มากถ้าสามารถรับประกันได้ว่าเมื่อคำขอสร้างข้อมูลได้รับการยืนยันแล้ว มุมมองข้อมูลอนุพันธ์ก็ได้รับการอัปเดตแล้วเช่นกัน
เคยตั้งคำถามนี้ไว้เมื่อ 6 ปีก่อน
Kafka บน object storage เหรอ? นั่นจะเพิ่มทั้ง latency และต้นทุน 10 เท่า
เรื่อง "การตัดพาร์ทิชันออก" และ "สตรีมระดับคีย์"
ควรจับตา Northguard
สงสัยว่าปัญหาของ Apache Kafka จะถูกแก้ได้มากแค่ไหนถ้าเปลี่ยนไปใช้ Apache Pulsar
เป็นการทดลองทางความคิดที่มีประโยชน์