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 āĻāϰā§