Consumer groups distribute; a plain read does not

Reading a Redis stream directly gives every consumer every entry, which is right for fanout and wrong for a work queue.

# every consumer sees everything
XREAD COUNT 10 STREAMS orders 0

# the group distributes, and remembers what was handed out
XGROUP CREATE orders workers 0 MKSTREAM
XREADGROUP GROUP workers worker-1 COUNT 10 BLOCK 5000 STREAMS orders '>'
XACK orders workers 1539172800123-0

The > means entries never delivered to this group, which is what makes the work split between members. BLOCK is the other reason to prefer this over polling: the worker waits rather than asking, so the latency floor is delivery time and the idle cost is nothing. Forgetting XACK produces a system that works perfectly and accumulates an unbounded pending list, which is a leak with no symptom until somebody looks.