A work queue built on `LPUSH` + `BRPOP` loses in-flight items whenever a worker crashes mid-job, because a popped list item is already gone from Redis the moment it's popped. A Redis stream with a consumer group is proposed instead. What does the pending entries list actually guarantee, and what obligation does it put on the workers?
A plain list's BRPOP removes and returns an item in one step — once a worker has it, Redis has no further record of it, so a worker that crashes before finishing loses that item permanently with nothing left to retry. A stream with a consumer group instead tracks, for every entry handed out via XREADGROUP, whether that entry has been acknowledged (XACK) yet — the pending entries list is exactly that record, and an entry stays in it, still recoverable, until it's acknowledged. Another worker can then claim it (XAUTOCLAIM) after it's been pending too long, which is at-least-once delivery: the tradeoff is that the same entry can genuinely be processed twice (once by the worker that crashed after finishing but before acknowledging, once by whoever claims it), so consumers have to be written to handle being run on the same entry more than once without corrupting anything.