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

สัญญา​บน​สาย — protobuf ที่​สอง​ฝั่ง​ไม่​เคย deploy พร้อม​กัน

ฝั่ง​ที่​เขียน​กับ​ฝั่ง​ที่​อ่าน​ไม่​เคย​ขึ้น​พร้อม​กัน​สัก​ครั้ง สิ่ง​เดียว​ที่​ผูก​สอง​ฝั่ง​ไว้​คือ byte ชุด​หนึ่ง กับ schema ที่​แต่ละ​ฝั่ง​ถือ​คนละ​ใบ คอร์ส​นี้​แก้ schema ที​ละ​อย่าง แล้ว​วัด​ว่า​ฝั่ง​ที่​ไม่​ได้​แก้​เห็น​อะไร คำ​ตอบ​คือ​เกือบ​ทุก​การ​แก้​ยัง parse ผ่าน ไม่มี error ไม่มี​รหัส​ให้​ดู มี​แค่​ค่าที่​ไป​นั่ง​ผิด​ช่อง​เงียบๆ คอร์ส​นี้​จึง​ไม่ใช่​คอร์ส​สอน​วิธี​เขียน .proto มัน​คือ​คอร์ส​ที่​ถาม​ว่าการ​แก้​แต่ละ​แบบ​ทำ​อะไร​กับ byte จริง และ​อะไร​บ้าง​ที่​เครื่อง​มือ​จับ​ให้​ได้​ก่อน​ของ​จะ​ขึ้น
ความคืบหน้า0 / 8 บทเรียน

สอง​ฝั่ง​ถือ schema คนละ​ใบ​และ​ไม่​เคย​ขึ้น​พร้อม​กัน คำถาม​คือ​การ​แก้​แต่ละ​แบบ​ทำ​อะไร​กับ byte

protobuf ไม่​ส่ง​ชื่อ field ไป​บน​สาย สิ่ง​ที่​ส่ง​คือ​หมายเลข​กับ wire type แล้ว​ตาม​ด้วย​ค่า ผู้​อ่าน​ปลาย​ทาง​จึง​ประกอบ message ขึ้น​ใหม่​จาก​หมายเลข ไม่ใช่​จาก​ชื่อ​ที่​คุณ​ตั้ง​ไว้​ใน schema

คำถาม​ของ​คอร์ส​คือ แก้ schema หนึ่ง​อย่าง​แล้ว​ฝั่ง​ที่​ยัง​ไม่​ได้​แก้ อ่าน​ได้ อ่าน​ผิด หรือ​อ่าน​ไม่​ออก

คำ​ตอบ​ที่​วัด​ได้​คือ เกือบ​ทุก​การ​แก้​ยัง parse ผ่าน และ​นั่น​คือ​ปัญหา สิ่ง​ที่​ทำให้​สัญญา​พัง ไม่ใช่ error แต่​เป็น​ค่าที่​เดิน​ไป​นั่ง​ผิด​ช่อง​โดย​ไม่มี​อะไร​แดง

ฝั่ง​เขียน​คือ Go ฝั่ง​อ่าน​คือ Java สอง runtime สอง code generator ถ้า​ข้อ​อ้าง​ไหน จริง​เพราะ runtime ตัว​เดียว มัน​จะ​โผล่​ตรง​ที่​สอง​ฝั่ง​ตอบ​ไม่​ตรง​กัน และ​มัน​โผล่​จริง​หนึ่ง​ครั้ง จาก​งาน​อ่าน​ทั้ง​ชุด

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

  • ไม่​วัด​ความเร็ว ทั้ง​คอร์ส​ไม่มี​หน่วย​เวลา​สัก​ตัว หน่วย​คือ​จำนวน byte ค่า hex หมายเลข field จำนวน unknown field และ​รหัส​ออก
  • ไม่​สอน gRPC ระดับ service ชื่อ method รหัส UNIMPLEMENTED และ streaming เป็น​คนละ​ชั้น​กับ​สาย​ที่​คอร์ส​นี้​วัด
  • ไม่​แตะ​การ map เป็น JSON มัน​มี​กฎ​ของ​ตัว​เอง​คนละ​ชุด​กับ wire format
  • ไม่​แตะ proto2 และ editions ทั้ง​สอง​อย่าง​เปลี่ยน​กฎ​ของ field presence ซึ่ง​เป็น​แกน​ของ​บท​ที่ 2 · คอร์ส​นี้​ใช้ syntax = "proto3" อย่าง​เดียว
  • ไม่​สอน buf breaking และ schema registry มัน​เป็น​เครื่อง​มือ ไม่ใช่​กฎ​ของ​สาย และ​เปลี่ยน version บ่อย​กว่า​ที่​คอร์ส​จะ​ตาม​ทัน บท​ที่ 8 จึง​บอก​แค่​ว่า​มัน​อยู่​นอก​ขอบเขต

อ่าน Go กับ Java ออก​ก็​พอ ส่วน​ความ​รู้​เรื่อง protobuf ไม่​ต้อง​มี​มา​ก่อน​เลย

  • อ่าน Go ออก​และ​อ่าน Java ออก ระดับ​ที่​ตาม​ตัว​อย่าง​สั้นๆ ได้​ก็​พอ ถ้า​ยัง​ไม่​ถึง​ตรง​นั้น เริ่ม​ที่ Go จาก​ศูนย์ หรือ Java จาก​ศูนย์ ก่อน
  • ไม่​ต้อง​รู้จัก protoc มา​ก่อน ทุก​ขั้น​ถูก​อธิบาย​ตอน​ที่​มัน​โผล่​ครั้ง​แรก
  • ควร​เคย​เจอ​สถานการณ์​ที่​สอง​บริการ​คุย​กัน​ข้าม​รุ่น เพราะ​นั่น​คือ​คำถาม​ที่​คอร์ส​นี้​ตอบ
  • ต้อง​มี Go, JDK และ Python 3 เพราะ​ทุก​ข้อ​อ้าง​ใน​คอร์ส​นี้​มา​จาก probe ที่​คุณ​รัน​เอง​ได้ ส่วน protoc กับ jar ของ Java นั้น up.sh ดึง​มา​ให้​เอง

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