Color of leaves in autumn from green and yellow to brown

ปัญหาหนึ่งที่มักเจอมาก ๆ ในการพัฒนาระบบงานคือ
การเปลี่ยนแปลง schema หรือ โครงสร้างของข้อมูลที่ใช้แลกเปลี่ยนกัน
ทำให้เกิดปัญหาเรื่อง compatibility ของข้อมูล
บ่อยครั้งจะเกิด breaking change จากที่ตั้งใจหรือไม่ตั้งใจก็ตาม
โดยเครื่องมือที่ได้รับความนิยมในการจัดการเรื่องนี้คือ Apache Avro
ปล. ใครที่ใช้งาน Apache Kafka น่าจะรู้จักเป็นอย่างดี

จาก Schema registry ของ Confluent จะมี compatibility types ต่าง ๆ ของ schema ดังนี้

  • BACKWARD
  • BACKWARD_TRANSITIVE
  • FORWARD
  • FORWARD_TRANSITIVE
  • FULL
  • FULL_TRANSITIVE
  • NONE

มาลองใช้งาน Apache Avro ในการจัดการจาก use case นี้กันดู

เริ่มต้นด้วย data model ของ Employee

เปลี่ยนจาก version 1 มาเป็น version 2 ดังนี้

โดยทำการออกแบบในรูปแบบของ Avro IDL (Interface Description Language)
ช่วยให้ออกแบบและเขียนตามการ coding ของภาษาต่าง ๆ ได้ง่ายนั่นเอง
รวมทั้งไม่ถนัดออกแบบในรูปแบบของ Avro Schema ที่เป็น JSON !!

เราสามารถทำการ generate file ของ Avro Schema ที่มีรูปแบบ JSON ได้ด้วย Avro tool

ตัวอย่างการใช้งาน Avro tool 1.10

จากนั้นทำการตรวจสอบหรือ validate ว่า schema ที่เราต้องการมัน compatible กันหรือไม่

ซึ่งตอบได้เลยว่า ไม่แน่นอน มี braking change เพียบ
ดังนั้นในการใช้งาน จะต้องมีขั้นตอนการเปลี่ยนแปลงเข้ามา
ยกตัวอย่างเช่น

  • ถ้ามีการ remove field ควรกำหนดค่า default ให้ด้วย และเป็นค่าที่แจ้งว่าจะยกเลิก เช่น DEPRECATED เป็นต้น เพื่อให้ backward compatibility
  • ถ้าเพิ่ม field เข้ามา ก็ต้องกำหนดค่า default เช่นกัน เพื่อให้ forward compatibility

จากตัวอย่างจะพบว่า
ต้องทำการเปลี่ยนจาก name ที่มีค่าเป็น string
มาเป็น name ที่มีชนิดเป็น record
หรือข้อมูลที่ประกอบไปด้วย firstname และ lastname
มันคือ การ ลบและเพิ่ม field นั่นเอง

ดังนั้นถ้าเราต้องการให้ Forward transitive แบบสวย ๆ จะได้

แต่เมื่อทำการแปลงมาเป็น Avro Schema ด้วย avro-tool 1.10 แล้วไม่ผ่าน !!

เจอ error แถมไปเจอว่าอยู่ใน PR 1562

สิ่งที่ต้องทำคือ ทำการ clone code จาก PR ดังกล่าวมา build เอง
จะได้เป็น version 1.12 ซึ่งแก้ไขแล้วนั่นเอง
ส่วน official ยังไม่มีนะ
ชีวิตจะเศร้า ๆ หน่อย

$git clone https://github.com/apache/avro.git
$git fetch origin pull/1562/head$git checkout -b pullrequest FETCH_HEAD
$mvn package

จากนั้นทำการ validate ง่าย ๆ ด้วยการเขียน test

หรือจะให้ง่ายขึ้นไปอีกด้วยการใช้งานผ่าน Avro Cli ไปก็ได้

จะเห็นว่า PASS คือ compatibility นั่นเอง
เพียงเท่านี้ก็ได้แนวทางของการตรวจสอบ Compatibility ของ Schema แบบง่าย ๆ แล้ว

Tags: