Skip to Content
Go Realm v1 is released 🎉
RabbitMQDay 6: Work Queues

Day 6

Work Queues, Fair Dispatch, and Prefetch

āφāϜāϕ⧇ āφāĻŽāϰāĻž āĻāĻŽāύ pattern āĻļāĻŋāĻ–āĻŦ āϝ⧇āĻ–āĻžāύ⧇ āĻ…āύ⧇āĻ• worker āĻāĻ•āϟāĻŋ shared queue āĻĨ⧇āϕ⧇ job consume āĻ•āϰ⧇āĨ¤

Workers

Work Queue Pattern

  • image resize
  • invoice generation
  • email sending
  • video processing
err = ch.Qos(1, 0, false) if err != nil { log.Fatal(err) }
for msg := range msgs { if err := doHeavyJob(msg.Body); err != nil { _ = msg.Nack(false, true) continue } time.Sleep(2 * time.Second) _ = msg.Ack(false) }

Which Worker Gets What?

Situation: āϤāĻŋāύ worker āφāϛ⧇āĨ¤ Worker A slow, B fast, C fastāĨ¤ Queue-āϤ⧇ ā§§ā§ĻāϟāĻŋ job āĻāϏ⧇āϛ⧇āĨ¤ Prefetch = 1.

Goal: Distribution-āĻāϰ behavior predict āĻ•āϰāĻžāĨ¤

What to think about:

  • Ack āύāĻž āĻĻāĻŋāϞ⧇ worker āύāϤ⧁āύ job āύ⧇āĻŦ⧇ āύāĻž
  • Fast worker āĻĻā§āϰ⧁āϤ free āĻšāĻŦ⧇
  • RabbitMQ only knows ack state, business cost āύāĻž
āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āϏāĻŽāĻžāϧāĻžāύ āĻĻ⧇āϖ⧁āύ

A āĻāĻ•āϟāĻŋ job āύāĻŋā§Ÿā§‡ busy āĻĨāĻžāĻ•āĻŦ⧇āĨ¤ B āĻāĻŦāĻ‚ C āĻĻā§āϰ⧁āϤ ack āĻ•āϰ⧇ āφāϰāĻ“ job āύ⧇āĻŦ⧇āĨ¤ āĻĢāϞ⧇ practical distribution fast worker-āĻĻ⧇āϰ āĻĻāĻŋāϕ⧇ naturally shift āĻ•āϰāĻŦ⧇āĨ¤

āĻ•āĻ–āύ work queue āωāĻĒāϝ⧁āĻ•ā§āϤ āύ⧟?

Checkpoint

āϕ⧇āω āϝāĻĻāĻŋ āĻŦāϞ⧇ 'queue āφāϛ⧇ āĻŽāĻžāύ⧇āχ worker pattern', āϤ⧁āĻŽāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ correction āĻ•āϰāĻŦ⧇?

  • Queue āĻĨāĻžāĻ•āĻž āĻŽāĻžāύ⧇āχ one-of-many worker āύāĻž
  • Broadcast-āĻāϰ āϜāĻ¨ā§āϝ fanout/topic binding āĻĻāϰāĻ•āĻžāϰ āĻšāϤ⧇ āĻĒāĻžāϰ⧇
  • Consumption semantics use case drive āĻ•āϰ⧇