คำถามที่น่าสนใจเกี่ยวการจัดการ message ด้วย RabbitMQ
ถ้าต้องการ route message ด้วย key ที่ต้องการ
แต่ key นั้นมัน dynamic เราไม่สามารถกำหนดได้
ต้องการให้ message ที่มี key เดียวกันเข้าไปทำงานที่ consumer เดียวกัน
เพื่อให้สามารถทำงานได้ตามที่ต้องการทาง business นั่นเอง

แนวทางใน RabbitMQ คือการทำ routing นั่นเอง

ซึ่งจะมีรูปแบบต่าง ๆ ให้เลือกใช้งานดังนี้

  • Fanout
  • Direct
  • Topic
  • Header
  • Consistent Hashing

แต่จาก use case นั้น น่าจะต้องใช้งาน Consistent Hashing

เนื่องจากเราไม่สามารถรู้เลยว่า key ที่ส่งเข้ามามีค่าอะไรบ้าง
ดังนั้นจำเป็นต้องใช้ Hashing function เข้ามาช่วย
สำหรับการ route message ไปยัง consumer ต่าง ๆ
ส่วนฝั่ง consumer จะต้องทำการ binding key ด้วยตัวเลขเท่านั้น
กำหนดได้เท่าที่เราต้องการ สามารถเพิ่มหรือลดได้เสมอ

ทำให้มั่นใจได้ว่า message ที่มี key เดียวกัน

จะเข้าทำงานที่ consumer เดียวกันแน่นอน
และถ้าต้องการให้เรียงลำดับการทำงานแบบ FIFO
โดยไม่ทำงานสลับกันทั้งเริ่มและสิ้นสุด
จำเป็นต้องกำหนดค่า prefetch=1
และกำหนด noAck=false เพื่อกำหนดการส่ง acknowledge กลับเอง

แต่การใช้งานจำเป็นต้องติดตั้ง plugin เพิ่ม
ชื่อว่า RabbitMQ Consistent Hash Exchange
เพียงเท่านี้ก็สามารถกำหนดให้ RabbitMQ ทำงานตามที่ต้องการแล้ว

ปล. ถ้าเป็น Apache Kafka จบไปนานแล้ว !!