สร้าง log broker เอง — Rust Systems VI
คอร์สนี้ต่อจาก kaen-kvstore ตรงไหน
หัวข้อที่มีชื่อว่า “คอร์สนี้ต่อจาก kaen-kvstore ตรงไหน”บท capstone ของคอร์สที่ 22 วาง segment ไว้เป็นสะพาน แล้วไม่มีคอร์สไหนเดินข้ามมันสักที
คอร์ส kaen-kvstore จบด้วยการประกาศเองว่า segment คือสะพาน ไปคอร์สถัดไป ส่วนคอร์ส Distributed Systems รับไม้ต่อไปทางระบบกระจาย ไม่ได้สร้าง segment ขึ้นมา
คอร์สนี้คือที่ที่ segment มาถึงจริง พร้อมสารบัญที่จงใจไม่เก็บทุก record และการอ่าน สองจังหวะที่ตามมาจากการยอมไม่เก็บให้ครบ
มีคำหนึ่งที่เปลี่ยนความหมายระหว่างสองคอร์ส และต้องรู้ก่อนเริ่ม คำนั้นคือ offset ใน kaen-kvstore มันคือตำแหน่ง byte ใน file ส่วนในคอร์สนี้มันคือลำดับของ record ใน partition ที่ broker เป็นคนแจก
ตำแหน่ง byte ยังอยู่ แต่มันมีชื่อของตัวเองว่า byte position เพราะสารบัญของคอร์สนี้ แม็ป offset ไปหา byte position ผู้อ่านที่มาจากคอร์สก่อนจึงจะเห็นคำเดิมอยู่สองฝั่ง ของลูกศรถ้าเราไม่แยกชื่อ
ทำไมไม่ใช้ Tokio ทั้งที่ซีรีส์นี้สอนไว้แล้ว
หัวข้อที่มีชื่อว่า “ทำไมไม่ใช้ Tokio ทั้งที่ซีรีส์นี้สอนไว้แล้ว”คำตอบคือคอร์สนี้เดินถอยลงจากคอร์สที่ 24 หนึ่งขั้นโดยตั้งใจ ไม่ใช่ผู้เขียนลืม
คอร์ส Async Rust ด้วย Tokio ปิดท้ายด้วยการเถียงว่า task ต่อหนึ่ง connection ชนะ thread ต่อหนึ่ง connection คอร์สนี้กลับไปใช้ thread ต่อหนึ่ง connection และใช้ Rust std ล้วน ไม่มี external crate สักตัว
เหตุผลมีข้อเดียว แก่นของคอร์สอยู่ที่ protocol กับ disk ไม่ได้อยู่ที่ scheduler การมี runtime เข้ามาอีกชั้นจะแย่งพื้นที่อธิบายของสิ่งที่คอร์สนี้ตั้งใจสอน
ราคาของการเลือก std ล้วน
หัวข้อที่มีชื่อว่า “ราคาของการเลือก std ล้วน”รายการนี้เป็นราคาที่ประกาศไว้ล่วงหน้า ไม่ใช่ข้อที่ผู้อ่านควรไปเจอเอาตอนกลางคอร์ส
- std ไม่มี CRC สักตัว คอร์สจึงเขียนตาราง CRC-32C ขึ้นเองแล้วเทียบกับค่าที่รู้คำตอบอยู่แล้ว
- ไม่มี compression เพราะ std ไม่มี codec ข้อนี้เป็นสิ่งที่ตัดออก ไม่ใช่รายละเอียดของชั้นขนส่ง
std::sync::mpmcยังไม่ stable งานที่ต้องการมันจึงต้องเขียนด้วยของที่ stable แทน- thread pool เป็นของที่เขียนเอง และมันมีกับดักของตัวเองที่คอร์สจะพูดถึงตรงๆ
เส้นขอบเขต — บทสุดท้ายไม่ใช่ cluster จริง
หัวข้อที่มีชื่อว่า “เส้นขอบเขต — บทสุดท้ายไม่ใช่ cluster จริง”ประกาศไว้ตรงนี้ เพื่อไม่ให้ใครอ่านจบแล้วเชื่อว่าได้ของที่คอร์สนี้ไม่ได้ให้
บทที่ 8 รัน broker สองตัวใน process เดียวกัน ทั้งสองตัวใช้ page cache ก้อนเดียวกัน และมีแหล่งจ่ายไฟเดียวกัน สิ่งที่มันสาธิตคือกลไกของ replication กับ high watermark เท่านั้น
ห้ามอ่านว่ามันสาธิต fault tolerance เพราะสิ่งที่ทำให้ระบบจริงทนความล้มเหลวได้ คือการที่เครื่องคนละเครื่องล้มไม่พร้อมกัน ซึ่งเป็นข้อที่การรันใน process เดียวพิสูจน์ไม่ได้เลย
สิ่งอื่นที่คอร์สนี้ไม่ทำ:
- ไม่มีชั้นเครือข่ายเลยสักบรรทัด
std::netไม่ถูกอ้างที่ไหนใน crate และ frame ทุกอัน วิ่งผ่าน buffer ในหน่วยความจำ บทที่ 4 ประกาศข้อนี้ไว้ตรงๆ พร้อมเหตุผล - consensus ทุกชนิดเป็นภาพวาด ไม่ใช่ของที่สร้าง และคอร์สจะบอกด้วยว่า KRaft เป็น Raft ของ metadata เท่านั้น ส่วนข้อมูลของ partition ยังเดินบน ISR
- transaction ข้ามระบบไม่ได้ถูกสร้าง คอร์สอธิบายว่าชิ้นส่วนของมันมีอะไรบ้าง แล้วหยุดตรงนั้น
- ไม่มี compression, TLS, ACL, quota และ tiered storage ทั้งหมดนี้ไม่มีในคอร์ส และการไม่มีของพวกนี้แปลว่าผู้อ่านสรุปอะไรเกี่ยวกับมันจากคอร์สนี้ไม่ได้
- ไม่มีตัวเลขเทียบกับ Kafka ตัวจริง เพราะไม่มีใครในรอบวิจัยรัน Kafka จริงสักตัว
ก่อนเริ่ม — สิ่งที่ควรมีมาก่อน
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม — สิ่งที่ควรมีมาก่อน”ต้องอ่าน Rust ออกและเคยเขียน server ที่คุยกันบน TCP มาก่อน ส่วนความรู้เรื่อง Kafka ไม่ต้องมี
- Rust ระดับที่ผ่าน ownership กับ borrow มาแล้ว และเคยใช้
ArcกับMutexจริง - เคยเขียนหรืออ่าน server ที่รับ byte จาก TCP ถ้าเพิ่งจบ kaen-kvstore มาก็พอแล้ว
- ไม่ต้องรู้จัก Kafka มาก่อน ทุกกลไกที่ยืมชื่อมาจากมันถูกอธิบายตอนที่มันโผล่ครั้งแรก
- ไม่ต้องติดตั้งอะไรเพิ่ม นอกจาก Rust toolchain เพราะทั้งคอร์สใช้ standard library ล้วน
เส้นทางการเรียน
หัวข้อที่มีชื่อว่า “เส้นทางการเรียน”แผนผังนี้จะเติมขึ้นเองเมื่อบทเรียนถูกเพิ่มเข้ามา