CloudEvents Standard
ตอนนี้ งานของผมเกี่ยวข้องกับ real-time integration และ real-time processing ฮะ ต้องจัดการกับข้อมูลหลายชุด หลายรูปแบบ หลาย format ทำให้โจทย์ใหญ่คือ จะทำยังไงดี ให้ทั้งฝั่งต้นทาง (source) และปลายทาง (consumer) สามารถเข้าใจและดึงข้อมูลไปใช้ได้ แบบที่ไม่มึนงงกันทั้งสองฝ่าย
ตัวช่วยนึง คือการกำหนด standard specification สำหรับ real-time event data ฮะ
CloudEvents
CloudEvents เนี่ย เป็น specification ที่มีแม่งานคือ Cloud Native Computing Foundation (CNCF) และได้เริ่มต้น project นี้ตั้งแต่ปีพ.ศ. 2561 มาแล้วฮะ
เอกสารทางการอยู่ใน Github ตามลิงก์ข้างล่างนี้นะฮะ
ข้อดีของ CloudEvents
ตัว standard นี้สามารถช่วยเราออกแบบระบบให้ผู้ใช้งานข้อมูลเข้าใจตัวข้อมูลได้ง่ายขั้นทั้งฝั่ง source และ consumer ว่าง่ายๆ ก็คือ มันเป็น framework ให้เราพัฒนา real-time data integration ได้สะดวกนั่นเองฮะ
เวลาเกิดปัญหาอะไรสักอย่าง เราสามารถไล่ check ย้อนกลับไปที่ต้นทางได้ง่ายขึ้น เพราะเรามี metadata แปะไว้อยู่ใน standard format นี้อยู่แล้วไงล่ะฮะ
ทีนี้ สิ่งที่เราต้องทำก็คือ เอามันมาปรับใช้เข้ากับ standard ที่มีอยู่แล้วของ projects หรือขององกรณ์เรานั่นเองฮะ
standard มีอะไรบ้าง
CloudEvents กำหนด event data ไว้เป็นสองกลุ่มใหญ่ฮะ
- Required fields
- Optional fields
Required fields
ตรงนี้จะมี 4 field ที่บังคับใส่ลงใน CloudEvents payload
id
id
เป็น string ระบุ event ฮะ สามารถกำหนดค่าเป็น UUID หรือ counter ก็ได้ แต่ต้องเป็นค่า unique นะsource
เป็น string ระบุ data source โดยแนะนำให้เป็นพวกที่อยู่บน internet อย่างเช่น URL หรือ email หรือเป็น application identifier ที่กำหนดที่อยู่ใน app ก็ได้
และข้อสำคัญsource
กับid
รวมกันจะต้องเป็นค่า unique ของทั้งระบบนะฮะspecversion
เป็นเลข version ของ CloudEvents standard ตอนนี้ก็เป็น1.0
อยู่ฮะ เพื่อให้รู้ว่า event นี้ใช้ standard version ไหนอยู่ จะได้เทียบกันได้type
type
เป็นค่าevent data type ที่ฝั่ง source กำหนดขึ้นมาฮะ ควรจะมี format แบบ package name เพื่อให้สามารถ track back กลับไปได้ในแต่ละขั้นของโปรแกรมฮะ
Optional fields
นอกเหนือจาก required field ข้างบนแล้ว ก็ยังมี optional field ที่เราสามารถเติมเข้าไปได้ ให้ event payload สมบูรณ์ตามที่ระบบออกแบบไว้ และควรจะเป็นไปตาม policy และ standard ที่ทีมหรือองค์กรเรากำหนดไว้ด้วยนะฮะ
datacontenttype
เพราะปกติใช้ Pub/Sub message ตรงส่วนนี้ผมเลยจะกำหนดเป็นapplication/json
ซึ่งเรากำหนดได้ตาม format ที่เราใช้จริงนะฮะdataschema
Schema ของ event data แนะนำให้เป็น URI format นะฮะsubject
เอาไว้แสดงหัวข้อสั้นๆ เกี่ยวกับ payload เผื่อในกรณีที่ consumer ต้องการรู้เนื้อหาแบบสรุปอะไรแบบนี้ฮะtime
Timestamp ที่ event นี้เกิดขึ้นใน format datetime stringdata
อันนี้แหละ ที่เราสามารถใส่เนื้อหา payload จริงๆ ของเราเข้าไปได้
Guidelines
- ทุก standard field ของ CloudEvents standard จะต้อง
- เป็น ตัวพิมพ์เล็ก ทั้งหมด
- เป็นตัวอักษรและตัวเลขเท่านั้น (alphanumeric, r'[a-z0-9]' )
- กระชับ สื่อความครบถ้วน
- ไม่ควรยาวเกิน 20 ตัวอักษร
- ขนาดของ data ไม่ควรเกิน 64KB จากฝั่ง source
- Security และ privacy
- ไม่ควรมี sensitive information
- ควรเข้ารหัส
- ควรตรวจสอบความปลอดภัยของช่องทางรับส่งข้อมูล
ตัวอย่าง CloudEvents payload
มี 4 required field ที่เหลือเราออกแบบเองได้ ทีนี้อย่างที่เล่าไป การออกแบบก็ควรล้อไปตาม policy/standard ของทีมเรา องค์กรเราด้วยนะฮะ