ข้าม​ไป​ยัง​เนื้อหา

สร้าง log broker เอง — Rust Systems VI

log ไม่ใช่​คิว มัน​คือ​ลำดับ​ที่​ไม่​เปลี่ยน ซึ่ง​ผู้​อ่าน​หลาย​ราย​เดิน​อยู่​คนละ​ตำแหน่ง และ​กลไก​ที่​เหลือ​ทั้งหมด​ของ broker คือ​สารบัญ การ​จอด​คำขอ การ​ลืม การ​กัน​ซ้ำ และ​การ​ทำ​สำเนา ล้วน​เป็น​ผล​ของ​การ​ยอมรับ​ข้อ​นั้น​ข้อ​เดียว ไม่ใช่ feature ที่​เติม​เข้า​มา​ทีหลัง คอร์ส​นี้​พาส​ร้าง kaen-log ตั้งแต่​ศูนย์​ด้วย Rust std ล้วน จน​ได้ binary ที่​ประกอบ​และ​ถอด frame ของ protocol ได้​จริง​ที​ละ byte
ความคืบหน้า0 / 8 บทเรียน

บท 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 ไม่มี CRC สัก​ตัว คอร์ส​จึง​เขียน​ตาราง CRC-32C ขึ้น​เอง​แล้ว​เทียบ​กับ​ค่าที่​รู้​คำ​ตอบ​อยู่​แล้ว
  • ไม่มี compression เพราะ std ไม่มี codec ข้อ​นี้​เป็น​สิ่ง​ที่​ตัด​ออก ไม่ใช่​ราย​ละเอียด​ของ​ชั้น​ขนส่ง
  • std::sync::mpmc ยัง​ไม่ stable งาน​ที่​ต้องการ​มัน​จึง​ต้อง​เขียน​ด้วย​ของ​ที่ stable แทน
  • thread pool เป็น​ของ​ที่​เขียน​เอง และ​มัน​มี​กับ​ดัก​ของ​ตัว​เอง​ที่​คอร์ส​จะ​พูด​ถึง​ตรงๆ

ประกาศ​ไว้​ตรง​นี้ เพื่อ​ไม่​ให้​ใคร​อ่าน​จบ​แล้ว​เชื่อ​ว่า​ได้​ของ​ที่​คอร์ส​นี้​ไม่​ได้​ให้

บท​ที่ 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 ล้วน

แผนผัง​นี้​จะ​เติม​ขึ้น​เอง​เมื่อ​บท​เรียน​ถูก​เพิ่ม​เข้า​มา