rabbitevents/redis-transport
A Redis pub/sub transport driver for RabbitEvents, letting Laravel applications broadcast and handle events over Redis instead of RabbitMQ. Swap brokers with minimal config changes while keeping the same event API and payloads.
rabbitevents:retry and failed messages now land on a per-queue direct stream (rabbitevents:queue:{queue}) instead of the shared topic stream. Previously those went back to the shared stream and were visible to every consumer group, i.e. cross-service duplicate work. This is the core product win: per-service retry isolation and predictable blast radius.{queue}.failed, so rabbitevents:failed, retry, forget and flush work on Redis. That unlocks real roadmap items — support runbooks, "replay a failed webhook" admin tooling, DLQ dashboards — without us writing bespoke failure storage.requeue() and reject(requeue: true) now actually redeliver in order (before, messages sat in the Pending Entries List and effectively vanished from view), and a PEL-stuck bug when a read spanned two streams is fixed. These are message-loss/duplicate-delivery class fixes, not polish — they change what SLAs we can honestly promise.rabbitevents/foundation ^10.0; RabbitEvents 9 users must stay on 0.0.x. This turns "do we adopt the Redis transport?" into "do we join the RabbitEvents 10 upgrade train?", which is a sequencing call for the platform roadmap.Adopt when:
failed/retry/forget/flush parity with the rest of Laravel's queue tooling.Look elsewhere (or defer) when:
setDeliveryDelay() no longer throws — but Redis can't delay delivery, so retries now fire immediately and --sleep (default 5) is effectively ignored. Any workflow relying on spacing out retries (third-party APIs, rate-limited downstreams, flaky webhooks) needs application-level backoff or a different transport. This is the single biggest caveat in the release.Migration note for planning: upgrading is not a flag day — entries already in the shared stream keep being delivered while new retries go to direct streams, so mixed-version traffic during rollout is safe. That materially lowers the risk of scheduling the upgrade.
To executives: This is a stability and cost-efficiency release for our event transport. It makes retries and failures isolated per service instead of leaking to every consumer, gives us a real failed-message queue with standard replay/forget tooling, and fixes two bugs that could silently lose or strand messages — so we can promise tighter delivery guarantees without new infrastructure spend. The trade-off is a coordinated upgrade to RabbitEvents 10 and an honest caveat that Redis can't schedule delayed retries, so retries happen immediately and any backoff must live in our application code.
To engineering: v1.0.0 is the first stable release and requires rabbitevents/foundation ^10.0 (stay on 0.0.x for RabbitEvents 9). Behavioural changes to plan around: each queue now reads the shared topic stream plus its own direct stream rabbitevents:queue:{queue}, and retries/requeues/rabbitevents:retry/failed messages are written to the direct stream rather than the shared one. Failed messages go to {queue}.failed, so rabbitevents:failed, retry, forget and flush now work with Redis. requeue() and reject(requeue: true) genuinely redeliver while preserving order. Two fixes worth noting: delayed retries previously crashed on setDeliveryDelay() — now they retry immediately (Redis can't delay), which removes the --sleep backoff and warrants a retry-storm review; and a Pending Entries List entry could get stuck when a single read returned entries from two streams. Upgrade is rolling-safe: in-flight shared-stream entries still deliver, only new retries use the direct streams.
Recommended next step: pilot on one non-critical service, confirm retry behaviour under induced failure (especially the immediate-retry path and downstream rate limits), validate the {queue}.failed runbook, then schedule the org-wide RabbitEvents 10 upgrade.
How can I help you explore Laravel packages today?