ตอนนี้ งานของผมเกี่ยวข้องกับ 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 ตามลิงก์ข้างล่างนี้นะฮะ

GitHub - cloudevents/spec: CloudEvents Specification
CloudEvents Specification. Contribute to cloudevents/spec development by creating an account on GitHub.

ข้อดีของ CloudEvents

ตัว standard นี้สามารถช่วยเราออกแบบระบบให้ผู้ใช้งานข้อมูลเข้าใจตัวข้อมูลได้ง่ายขั้นทั้งฝั่ง source และ consumer ว่าง่ายๆ ก็คือ มันเป็น framework ให้เราพัฒนา real-time data integration ได้สะดวกนั่นเองฮะ

เวลาเกิดปัญหาอะไรสักอย่าง เราสามารถไล่ check ย้อนกลับไปที่ต้นทางได้ง่ายขึ้น เพราะเรามี metadata แปะไว้อยู่ใน standard format นี้อยู่แล้วไงล่ะฮะ

ทีนี้ สิ่งที่เราต้องทำก็คือ เอามันมาปรับใช้เข้ากับ standard ที่มีอยู่แล้วของ projects หรือขององกรณ์เรานั่นเองฮะ


standard มีอะไรบ้าง

CloudEvents กำหนด event data ไว้เป็นสองกลุ่มใหญ่ฮะ

  1. Required fields
  2. Optional fields

Required fields

ตรงนี้จะมี 4 field ที่บังคับใส่ลงใน CloudEvents payload

  1. id
    id เป็น string ระบุ event ฮะ สามารถกำหนดค่าเป็น UUID หรือ counter ก็ได้ แต่ต้องเป็นค่า unique นะ
  2. source
    เป็น string ระบุ data source โดยแนะนำให้เป็นพวกที่อยู่บน internet อย่างเช่น URL หรือ email หรือเป็น application identifier ที่กำหนดที่อยู่ใน app ก็ได้
    และข้อสำคัญ source กับ id รวมกันจะต้องเป็นค่า unique ของทั้งระบบนะฮะ
  3. specversion
    เป็นเลข version ของ CloudEvents standard ตอนนี้ก็เป็น 1.0 อยู่ฮะ เพื่อให้รู้ว่า event นี้ใช้ standard version ไหนอยู่ จะได้เทียบกันได้
  4. type
    type เป็นค่าevent data type ที่ฝั่ง source กำหนดขึ้นมาฮะ ควรจะมี format แบบ package name เพื่อให้สามารถ track back กลับไปได้ในแต่ละขั้นของโปรแกรมฮะ

Optional fields

นอกเหนือจาก required field ข้างบนแล้ว ก็ยังมี optional field ที่เราสามารถเติมเข้าไปได้ ให้ event payload สมบูรณ์ตามที่ระบบออกแบบไว้ และควรจะเป็นไปตาม policy และ standard ที่ทีมหรือองค์กรเรากำหนดไว้ด้วยนะฮะ

  1. datacontenttype
    เพราะปกติใช้ Pub/Sub message ตรงส่วนนี้ผมเลยจะกำหนดเป็น application/json ซึ่งเรากำหนดได้ตาม format ที่เราใช้จริงนะฮะ
  2. dataschema
    Schema ของ event data แนะนำให้เป็น URI format นะฮะ
  3. subject
    เอาไว้แสดงหัวข้อสั้นๆ เกี่ยวกับ payload เผื่อในกรณีที่ consumer ต้องการรู้เนื้อหาแบบสรุปอะไรแบบนี้ฮะ
  4. time
    Timestamp ที่ event นี้เกิดขึ้นใน format datetime string
  5. data
    อันนี้แหละ ที่เราสามารถใส่เนื้อหา 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 ของทีมเรา องค์กรเราด้วยนะฮะ

ตัวอย่างที่ 1: User login event

ตัวอย่างที่ 2: Sensor data