กระรอก Go สีฟ้าเขียวทดลองจัดข้อมูลบนโต๊ะทำงาน โทนสว่างสีมิ้นต์และครีม

Go Serialization 04: Avro และต้นทุนของ schema

พี่โชว์Engineering

Avro แยก schema ออกจากข้อมูล binary ได้ครับ สิ่งแรกที่ต้องตกลงคือผู้รับจะหา writer schema จากไหน ตัวอย่างนี้ใช้ schema เดียวกันที่ฝังมากับโปรแกรม เพื่อให้เห็นต้นทุนการแปลงข้อมูลโดยไม่รวมระบบ registry

เตรียมโปรเจกต์

ดาวน์โหลด โปรเจกต์ Go พร้อม schemas, generated code, tests และผลดิบ แล้วแตกไฟล์ ใช้ Go 1.27 ขึ้นไป เปิด terminal ในโฟลเดอร์ go-api-serialization และรัน go mod download ครั้งแรก ไม่ต้องติดตั้ง compiler ของ schema เพื่อเริ่มเรียน

โค้ดบนหน้านี้เป็นตัวอย่างบางส่วน (fragment) เพื่ออธิบายจุดสำคัญ คำสั่ง shell ตรวจ syntax ส่วน โปรเจกต์เต็มตรวจด้วย go test ./... ใน quality gate ไม่ควรนำ fragment ไปรันเป็นโปรแกรมเดี่ยว

1. ดูโครงสร้างสัญญา

เปิด schemas/catalog.avsc จะเห็น record ชื่อ Catalog ที่มี array ของ Product ชนิด long ตรงกับ ID และราคา int64 ชื่อและ tags ใช้ string ส่วน stock ใช้ boolean

ตัวอย่างบางส่วนใน NewCodecs แสดงจุดที่ parse schema ครั้งเดียว:

schema, err := avro.Parse(avroSchemaText)
if err != nil { return nil, err }
encode := func(c Catalog) ([]byte, error) {
    return avro.Marshal(schema, c)
}

อย่าย้าย avro.Parse เข้า benchmark loop แล้วสรุปว่า Avro ช้า เพราะ production สามารถเตรียม schema ไว้ได้ ผลนี้เป็น raw Avro binary ไม่ใช่ Object Container File ซึ่งมี header/schema และ framing เพิ่มเติม

2. ทดสอบข้อมูลเสียด้วย

go test -run 'TestRoundTrip/avro|TestInvalidInputs/avro' -v
go test -run '^$' -bench 'BenchmarkCodecs/avro' -benchmem -benchtime=300ms -count=5
go run ./cmd/sizes

ผลที่ตรวจได้: Thai round-trip ผ่าน ข้อมูลที่ tests ตัดขาด/เสียต้องคืน error โปรเจกต์ใช้ Reader ตรวจ error หลังอ่าน record และตรวจว่าถึงท้าย buffer จริง เพราะ high-level decode บางเส้นทางอาจมอง EOF เป็นจบ stream ได้ การตรวจนี้รวมอยู่ในต้นทุน decode ที่รายงาน

3. คิดเรื่อง schema evolution

Avro มีกฎ writer/reader schema resolution แต่ไม่ได้หมายความว่าเปลี่ยน type หรือเพิ่ม field ใดก็ได้แล้วข้อมูลเก่าจะอ่านได้เสมอ ขอบเขต Workshop นี้ยังไม่จำลอง registry, schema IDs หรือการ rollout หลายเวอร์ชัน ต้องออกแบบส่วนเหล่านั้นเพิ่มหากใช้เป็น event platform

แบบฝึกหัด

สร้าง schema สำเนาที่เพิ่มฟิลด์พร้อม default แล้วอ่านกฎ resolution ในเอกสารทางการ เขียน test แยกข้อมูลเก่ากับ reader schema ใหม่ จากนั้นทดลองการเปลี่ยนที่เข้ากันไม่ได้และตรวจว่าระบบแสดง error ชัดเจน อย่านำผลการทดลอง schema ใหม่ไปรวมกับ baseline เดิม

อ่านต่อ