ก่อนหน้านี้เราใช้ Kafka เป็นหลัก ก็เลยชินกับการที่ข้อความในแต่ละ partition จะเรียงลำดับ พอเริ่มใช้ Google Cloud Pub/Sub จริงจังครั้งแรก ก็คิดว่า “มันก็น่าจะคล้าย ๆ กันแหละ…”
แต่ความจริงคือ Pub/Sub ไม่จัดลำดับข้อความให้โดยอัตโนมัติ และเราก็เพิ่งรู้ตอนที่เจอปัญหาแล้ว 😅
ปัญหาที่เจอ
อยู่ดี ๆ service ฝั่ง consumer เริ่มประมวลผลข้อความสลับลำดับ ทั้งที่ฝั่ง publisher ส่งมาเรียงตามลำดับที่ต้องการ เช่น:
- message 1
- message 2
แต่กลับกลายเป็นว่า message 2 มาถึงก่อน message 1 ซะอีก ลองเช็กดูถึงรู้ว่า…
Pub/Sub จะไม่เรียงลำดับข้อความ หากเราไม่ได้เปิด “Message Ordering” ตอนสร้าง subscription
และที่สำคัญคือ ถ้าไม่ได้เปิดไว้ตั้งแต่แรก จะมาเปิดทีหลังไม่ได้
วิธีที่เราแก้
เราต้องลบ subscription เดิม แล้วสร้างใหม่ โดยเปิดตัวเลือก Enable message ordering
ผ่าน Command Line:
gcloud pubsub subscriptions create my-subscription \
--topic=my-topic \
--enable-message-ordering
ผ่าน Google Cloud Console:
แล้วการไม่เปิด Message Ordering ดีกว่ายังไง?
ถ้า use case ของเราไม่ต้องพึ่งลำดับของข้อความ เช่น:
- Logging / telemetry
- Notification ทั่วไป
- Broadcast events
การไม่เปิด message ordering จะทำให้ระบบเร็วและยืดหยุ่นกว่า เพราะ Pub/Sub จะสามารถส่งข้อความแบบขนาน (parallel) ได้เต็มที่ ไม่ต้องรอข้อความก่อนหน้า
ข้อดีหลัก ๆ คือ:
- ลด latency
- ประสิทธิภาพสูงขึ้น
- รองรับการ scale ได้ดีกว่า
สรุปสิ่งที่เราได้เรียนรู้
- ถ้าข้อความมีลำดับสำคัญ → ต้องเปิด Message Ordering ตอนสร้าง subscription
- ลืมเปิด = ต้องลบแล้วสร้างใหม่เท่านั้น (แก้ภายหลังไม่ได้)
- ไม่ใช่ทุกงานต้องเปิด ordering → ถ้าไม่จำเป็น จะได้ performance ที่ดีกว่า
- Pub/Sub กับ Kafka ทำงานต่างกัน อย่าคิดว่า logic เดิมจะใช้ได้เหมือนกัน
หวังว่าโพสต์นี้จะช่วยให้คนที่เพิ่งเริ่มใช้ Pub/Sub ไม่เจอปัญหาแบบเรา หรืออย่างน้อย… ได้รู้ทันก่อนจะสายเกินไป 🙂