ก่อนหน้านี้เราใช้ 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:

Pub/Sub ลำดับข้อความเพี้ยน เพราะลืมเปิด Message Ordering

แล้วการไม่เปิด 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 ไม่เจอปัญหาแบบเรา หรืออย่างน้อย… ได้รู้ทันก่อนจะสายเกินไป 🙂