Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Redis Transport Bundle Laravel Package

handcraftedinthealps/redis-transport-bundle

A Symfony bundle that adds a Redis-based transport, letting you route messages through Redis instead of a traditional queue backend. It wires up the transport configuration and supporting services, making it straightforward to plug Redis into a messenger-style workflow with minimal setup in your app...

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Headline finding: despite being scoped as a "Laravel/PHP package," this is a Symfony Messenger transport bundle, not a Laravel queue driver. It ships a Symfony TransportFactory, a DI extension, and services wired into the Symfony container. Laravel's queue subsystem (Illuminate\Queue) has a completely separate connector contract and a list-based Redis driver (LPUSH/BRPOP), not Redis Streams. This is a framework-category mismatch, not a version-compatibility issue.

Release delta — 1.2.2 (2025)

  • Single change: Symfony 7 support (PR #23). No breaking changes, no deprecations, no API surface change, no Laravel-specific work.
  • This is a maintenance release, not a capability release. It does not narrow the framework mismatch and does not add any Laravel integration.
  • Genuine but limited positives: (a) it resolves a real Composer-friction point — Laravel 11 sits on Symfony 7 components, Laravel 10 on Symfony 6.x, so a symfony/messenger ^6.4|^7.0 constraint makes the transport installable in both without pinning conflicts; (b) it is a second data point of responsive maintenance (external contributor PR merged, shipped in a patch bump).
  • It partially answers key question 5 and mildly downgrades framework-drift risk. It does not change the build-vs-adopt recommendation, the bus-factor position, or the need for a Laravel adapter.

Architecture fit

  • Value proposition is real: Redis Streams give consumer groups, acknowledgements, pending-entry tracking, and replay — semantics Laravel's Redis queue driver does not offer (no native ack/replay; Horizon adds observability but not stream semantics).
  • Fit as published is poor for a Laravel codebase. Two viable shapes:
    1. Standalone transport — instantiate the transport/connection classes directly and expose them through a custom Laravel queue connector (Queue::extend). The bundle's Laravel-irrelevant parts (DI extension, Symfony config tree) are bypassed.
    2. Reimplement thin — Redis Streams primitives are ~8 commands (XADD, XREADGROUP, XACK, XAUTOCLAIM, XPENDING, XGROUP, XLEN, XTRIM). A 300–500 LOC Laravel connector may be cheaper to own than adapting Symfony's abstractions.
  • Adoption signals remain weak: 6 stars, 0 dependents, single maintainer. We would likely be the largest consumer of this code in existence. Symfony 7 support does not move these numbers.

Integration feasibility

  • Technically feasible but not turnkey. Requires symfony/messenger as a transitive dependency inside a Laravel app — a large, opinionated component pulled in for one transport class.
  • Laravel's container is PSR-11 compliant, so constructor injection of the transport works; the friction is in DSN parsing, serializer coupling (Symfony envelopes vs Laravel job payloads), and retry/failure transport semantics that Laravel expects but Symfony models differently.
  • Queue::fake(), Horizon dashboards, and queue:retry/queue:failed tooling all assume Laravel-native payloads — expect these to break or need shims.

Technical risk

  • Framework drift (medium-high, downgraded from high): 1.2.2 demonstrates the maintainer tracks Symfony majors. That is the exact failure mode we were worried about, and it was handled. Residual risk remains — the transport is still coupled to Symfony internals we get no benefit from, and a future major could sit unaddressed for months with one maintainer.
  • Bus factor (high, unchanged): one maintainer, MIT, no SLA, sparse release history. The 1.2.2 merge is reassuring, not structural.
  • Operational complexity transferred to us (medium-high, unchanged): consumer groups, pending entries list (PEL), XAUTOCLAIM reclaim loops, and stream trimming are now our runbooks, not the framework's.
  • Ecosystem mismatch (high, unchanged): every Laravel queue affordance (Horizon metrics, failed-job table, dispatch()->onQueue()) needs verification or replacement.
  • Licensing/compliance (low): MIT is clean.

Key questions

  1. Do we actually need Streams semantics (consumer groups, at-least-once replay, ack tracking, multiple independent consumer sets), or is this a "we want faster Redis queues" request that Horizon + SQS/Redis lists already satisfies?
  2. What is the real driver — throughput, ordering, replay-on-failure, or fan-out to multiple consumer groups? Each has a different cheapest answer.
  3. Are we prepared to fork and own this (pin, patch, CVE response) or does it need an internal maintainer commitment?
  4. Does it support Redis Cluster and Sentinel? Multi-key stream ops and XREADGROUP BLOCK behave differently under cluster.
  5. What Symfony/PHP versions are supported? Partially answered by 1.2.2: Symfony 6.4 and 7.x supported, implying a PHP 8.2+ floor for the Symfony 7 path. Still open: whether a CI matrix actually exercises both, and whether PHP 8.1 (Laravel 10's floor) is in scope.
  6. Is there an existing, better-adopted Laravel-native alternative (or a documented SQS/Kafka path) that meets the same requirement?

Integration Approach

Stack fit

  • Poor out-of-the-box, moderate with an adapter. Recommended shape: do not install the bundle as a bundle. Vendor or depend on it only for its transport/connection classes, wrap in a RedisStreamsConnector implements Illuminate\Contracts\Queue\Queue, and register via Queue::extend('redis-streams', ...) in a service provider.
  • Keep the Laravel Redis connection separate from the app's cache/session connection — Streams need dedicated keys, block timeouts, and trimming policy, and must not share a connection with BRPOP-style blocking consumers.

Migration path

  • Do not migrate existing queues. Introduce as a net-new queue name for a bounded workload (e.g. webhook fan-out or an idempotent, replay-tolerant job class).
  • Dual-path period: emit to both the existing Laravel queue and the Streams transport for shadow comparison, with the Streams consumer in dry-run/log-only mode to validate lag, duplicates, and ordering before it takes real side effects.

Compatibility

  • Pin to an exact tag — 1.2.2 is the current floor — and vendor the code (or a private fork) so upstream abandonment doesn't block upgrades. 1.2.2 is the first release safe to adopt on a Laravel 11 / Symfony 7 baseline; treat 1.2.1 and earlier as superseded.
  • Serialization is the sharpest edge: Symfony Messenger envelopes vs Laravel's serialized job payloads. Standardize on a JSON payload contract with an explicit job class key and version field; don't attempt to reuse Symfony's PHP serializer.
  • Verify Redis ≥ 5.0 (Streams GA) — realistically 6.2+ for XAUTOCLAIM; confirm against our managed Redis offering.

Sequencing

  1. Sprint 1 — spike (timeboxed): prove end-to-end delivery + ack + reclaim against a real Redis with a Laravel connector prototype on 1.2.2. Decision gate: adapter LOC and breakage surface.
  2. Sprint 2 — hardening: retry/backoff, dead-letter stream, trimming policy, idempotency keys, metrics.
  3. Sprint 3 — shadow: parallel run, no side effects, compare against incumbent path.
  4. Sprint 4 — canary: one low-risk queue, 5–10% traffic, then full cutover or rollback.
  5. Ongoing: document the fork-maintenance and upgrade policy before step 4 ships.

Decision recommendation: unchanged. Treat this as a build-vs-adopt spike with a default of "adopt only if the Streams requirement is confirmed and the adapter stays under ~2 engineer-weeks." At 6 stars and 0 dependents, the package is a reference implementation, not a dependency. 1.2.2 makes adoption slightly safer by removing a Composer conflict on modern Laravel; it does not make it strategically different.

Operational Impact

Maintenance

  • Still the highest ongoing cost item. Budget an internal owner with PHP/Redis depth. Expect to carry a fork within 12 months: pin the tag, maintain a CHANGELOG of local patches, and re-evaluate quarterly against upstream activity.
  • 1.2.2 is a modest positive: the maintainer shipped a Symfony major-track update within a reasonable window, which is the single most likely reason we'd have been forced to fork. Watch for whether this cadence holds through Symfony 8 — one release is a signal, not a guarantee.
  • Upgrades remain gated on Symfony Messenger's release cadence even though we don't use Symfony. 1.2.2 does not remove that coupling; it just demonstrates it is currently being managed.

Support

  • MIT with no commercial backing, no SLA, no security policy evident. Issue response is best-effort. Treat upstream as advisory; our fork is the source of truth.
  • No community of practice to lean on (0 dependents) — internal documentation is the only knowledge base.

Scaling

  • Redis Streams scale well for our likely range: consumer groups allow horizontal worker fan-out; XREADGROUP with COUNT and BLOCK gives good batching; adding consumer groups supports independent consumer sets (a genuine advantage over Laravel lists).
  • Memory is the constraint: streams grow indefinitely unless trimmed. Mandate MAXLEN ~ (approximate) or MINID retention on every XADD, sized to peak-lag-plus-replay-window, and alert on XLEN.
  • Consumer-group lag is not surfaced by Horizon — we must emit custom metrics (XINFO GROUPS: lag, pending, consumers) into our existing observability stack.

Failure modes

  • Stuck PEL: worker crashes after read, before ack → message sits in pending forever. Requires a reclaim loop (XAUTOCLAIM with min-idle-time) — this is not optional and is the most common production failure.
  • Duplicates: at-least-once delivery guarantees repeats on reclaim and on Redis failover. All jobs must be idempotent; enforce via idempotency key middleware, not reviewer discipline.
  • Unacked loss on failover: replication is asynchronous by default; a primary failure can lose un-replicated entries. Acceptable for replay-tolerant jobs, not for payments.
  • Blocking read timeouts / connection pool exhaustion: long BLOCK values pin connections; workers must handle null reads and reconnect cleanly.
  • Trim-too-aggressively: silently drops messages never delivered. Trimming policy needs a guardrail and a review.
  • Cluster misconfiguration: multi-key stream operations and consumer-group metadata can cross hash slots; validate against our actual topology.
  • Silent stall: worker alive, group lag climbing, no alarm — the classic Streams outage. Lag alerting is mandatory before canary.

Ramp-up

  • Team is Laravel-native; Symfony Messenger's envelope/middleware model and Streams consumer-group semantics are both new. Estimate 1.5–2 engineer-weeks to productivity for the owning pair, plus a written runbook covering reclaim, drain, lag triage, and DLQ replay.
  • Include a "how to retire this" section: the exit path back to Laravel's native queue or SQS must be documented at adoption time, because the strongest argument against this package is that removing it later is as expensive as adding it now.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator