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

Symfony Messenger Redis Laravel Package

krak/symfony-messenger-redis

Redis transport for Symfony Messenger, enabling asynchronous message dispatch and consumption through Redis. Integrates with Messenger’s transport system to support queue-based workflows in Symfony applications.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Verdict up front (unchanged): no-go for a Laravel/PHP stack. v0.1.8 does not alter the recommendation — it hardens it. The only functional change is "Support Symfony 5," which points the package's compatibility ceiling at an end-of-life Symfony major rather than toward the Symfony 7.x components that Laravel 11/12 depend on. Combined with no Laravel integration surface and near-zero adoption, this remains a transport shim for a problem Laravel already solves natively.

Architecture fit

  • Unchanged. Laravel ships a first-class Redis queue driver backed by Illuminate\Queue, integrated with queue:work, failed_jobs, events, batching, and Horizon. This package targets symfony/messenger's TransportInterface — a separate abstraction that Laravel's worker, dispatcher, and job lifecycle do not understand.
  • Adopting it means running two parallel messaging substrates: Laravel queues for framework-driven work (mail, broadcasting, notifications, dispatch()), and a Messenger bus for anything routed through this transport. That architectural tax buys a capability that is otherwise a config flag.
  • Symfony Messenger's differentiators — envelope/stamp middleware, per-bus routing, multi-transport fan-out, handler-based dispatch — remain component features, not this package's features. The package is the Redis transport shim underneath them, and v0.1.8 adds nothing to that surface.

Integration feasibility

  • v0.1.8 adds no Laravel surface: still no service provider, no config stub, no facade, no documented Laravel path. The second bullet of the release notes ("Upgrade dev devs" — presumably dev dependencies) is not production-affecting and should be read as housekeeping, not capability.
  • Technically installable in principle, but the glue remains entirely ours: container bridging (Symfony ContainerInterface vs Laravel's), a custom messenger:consume command replacing queue:work, handler discovery, serialization wiring, retry/failure transport configuration, and a health/metrics story. Still a multi-week spike, not an afternoon.
  • The release slightly improves the activity signal (the maintainer is reachable and shipping) but worsens the direction signal. Adding Symfony 5 support in a patch release, with no mention of Symfony 6.3+/7, reads as supporting older versions rather than tracking current ones — the opposite of what our stack needs.

Technical risk

  • Constraint direction is now the dominant risk, and it got worse. "Support Symfony 5" tells us the declared range includes Symfony 5.x (EOL since November 2023). Laravel 10 moved to Symfony 6.x components; Laravel 11/12 sit on Symfony 6.4/7.x. Either the package's range is ^5.x only — a hard composer conflict with any modern Laravel — or it was widened to ^5.4|^6.x, still short of 7.x. Both outcomes block adoption on our target version. This must be read from composer.json, not inferred from the changelog.
  • Release hygiene is a secondary flag. Widening a framework-dependency constraint inside a v0.1.8 patch bump means the package's compatibility envelope can shift on a routine upgrade. Pin exact versions and commit the lockfile; do not float this dependency.
  • Bus factor of one, unchanged. No dependents means no downstream pressure to fix bugs, no community patches, and no evidence anyone runs this in production. Effectively you adopt a fork you maintain.
  • Semantics remain unverified. v0.1.8 does not disclose whether the transport uses Redis Streams with consumer groups or simple list operations. That answer determines at-least-once delivery and multi-consumer safety — or silent loss under concurrent consumers. Read it from source.
  • MIT license remains clean; still the one low-risk dimension.

Key questions (Q3 is now partially answered — and the answer is adverse; the rest stand)

  1. What Redis primitive does the transport use — XADD/XREADGROUP (Streams, ack + pending list) or LPUSH/BRPOP (fire-and-forget)? Unchanged and still the highest-value unknown.
  2. Is there an acknowledgement/visibility-timeout mechanism, and what happens to in-flight messages if a consumer dies mid-processing?
  3. Partially answered: the declared symfony/messenger ceiling now includes Symfony 5. Remaining sub-questions: (a) exact declared range in composer.json — ^5.x only, or ^5.4|^6.x? (b) is 6.3+/7.0 support planned or explicitly out of scope? (c) what PHP versions are declared, and does it resolve against our production Laravel minor without --ignore-platform-reqs?
  4. Is there a dead-letter / failure transport path, and how are retries and backoff expressed?
  5. Which serializer is used by default — PHP serialize() (class-name-coupled, breaks on rename) or JSON?
  6. Is the consumer a blocking BRPOP loop, and how does it behave on Redis reconnect or failover?
  7. Is Redis Cluster supported (multi-key operations, hash tags)?
  8. Does it expose any observability hooks — consumer name, queue depth, pending count?
  9. v0.1.8 confirms the maintainer is active; still unproven is issue responsiveness, security handling, and whether Symfony 7 is on any roadmap.
  10. If we adopted it, who owns the fork when the next incompatibility surfaces — and who owns it now that the package is deliberately supporting an EOL framework major?

Integration Approach

Stack fit

  • Poor for a Laravel-first codebase, and materially worse than at the last assessment: the only verified compatibility statement in the release is support for a Symfony version Laravel no longer uses. Laravel's native Redis driver plus Horizon delivers retries, backoff, timeouts, prioritization, autoscaling, and a UI — zero custom code, large hiring pool.
  • The only defensible fit remains a polyglot service bus: an existing Symfony service publishing Messenger envelopes that a Laravel service must consume without rewriting the producer. Even then, prefer a thin adapter of your own — and note that such a producer is increasingly unlikely to be on Symfony 5.

Migration path

  • There is still no migration to this package that makes sense from a Laravel baseline; it is additive-only and creates a second, unmanaged queue plane.
  • The realistic direction remains the inverse: retire Messenger and port handlers to Laravel jobs. Redis Streams map cleanly onto Laravel's redis driver; handler classes map onto ShouldQueue jobs. Budget per handler, not per service.
  • If Messenger semantics are genuinely non-negotiable (middleware pipeline, stamps, per-bus routing), the correct dependency is the official symfony/redis-messenger transport — same semantics, core-team maintained, tracks Symfony 7. v0.1.8 strengthens this conclusion rather than weakening it: the only gap this package could fill is Symfony 5, which is precisely the gap we do not have.

Compatibility

  • This is now a likely hard stop before the spike begins. Pin and verify: exact symfony/messenger range from composer.json, PHP constraint, ext-redis vs predis/predis, and Redis server version (Streams require ≥5.0). Validate against the exact Laravel minor in production, not latest.
  • If the package caps at Symfony 5, the only compatible Laravel is 9 or earlier — itself out of security support. That is not a trade-off worth documenting; it is a rejection.

Sequencing

  1. Gate 0 — constraint read (do this first, it is cheap and can end the evaluation). Pull composer.json from the v0.1.8 tag. If the symfony/messenger range excludes 6.4/7.x, stop — no spike required, no further analysis justified.
  2. Gate 1 — source read. If Gate 0 passes, answer questions 1–5 from the code. No ack/visibility mechanism → stop.
  3. Gate 2 — dependency resolution. Prove composer require resolves cleanly against the target Laravel minor with no constraint flags. Failure is a hard stop.
  4. Gate 3 — disposable spike. One producer, two competing consumers, Redis restart mid-flight, poison-message injection. Measure loss, duplication, stuck-pending behavior.
  5. Gate 4 — operational wrapper. Only if 1–4 pass: custom worker command, health check, queue-depth metric, documented failure runbook. Keep the transport behind an internal interface so it can be swapped for symfony/redis-messenger or the native driver without touching call sites.

Operational Impact

Maintenance

  • Treat as vendored code, unchanged. v0.1.8 shows a live maintainer, which marginally improves the "will anyone answer" question but does not change the steady state: no dependents, no community, a one-person lifecycle. The realistic outcome is a maintained fork inside our organization — a permanent, unbudgeted headcount tax on a component providing no differentiated capability.
  • The release adds a specific, recurring maintenance trigger: every modern Symfony bump is a manual patch, and the package's stated direction (adding Symfony 5) suggests those patches will come from us, not upstream.

Support

  • No vendor, no SLA, no security policy, no CVE path. Documentation remains a README of unknown depth; v0.1.8 ships none.
  • On-call engineers hitting a stuck or dropping queue will find no Stack Overflow corpus and no community channel. Internal runbooks are mandatory, not optional.

Scaling

  • Redis-backed consumers scale horizontally by worker count, but the ceiling still depends on the unanswered ack question — a naive BRPOP loop scales fine for throughput and badly for reliability.
  • Horizon will not see these jobs. No autoscaling, no throughput metrics, failed-job UI, or job tagging. Rebuilding that observability is the single largest hidden cost here, and v0.1.8 does nothing to reduce it.
  • Redis persistence policy (RDB vs AOF) becomes a message-durability decision, not a cache decision — a material change to how the Redis tier is operated.

Failure modes

  • Message loss if the transport lacks ack semantics and a worker dies mid-handler — silent, typically found via missing downstream records rather than an alert.
  • Serialization desync on deploy if PHP serialize() is used and a message class is renamed or moved; in-flight messages become unreadable, making deploy ordering load-bearing.
  • Poison messages with no dead-letter path will loop indefinitely or block a partition depending on the pop strategy.
  • Reconnect behavior on a blocking pop remains a classic consumer-stall source; must be tested explicitly against managed Redis failover.
  • Constraint drift on patch upgrades — new this release. A patch bump can move the framework compatibility envelope; pin exact versions and commit the lockfile.
  • Dual-substrate drift: retries, timeouts, and failure handling diverge between Laravel jobs and Messenger consumers, producing inconsistent incident response.

Ramp-up

  • Unchanged and unmitigated: a Laravel team inherits a new mental model — envelopes, stamps, middleware, buses, transport-level retry — with no framework-native documentation. Realistically 1–2 weeks per engineer before they can debug a production incident confidently.
  • Counterfactual is near zero: every Laravel engineer already knows queue:work and Horizon.
  • Net: v0.1.8 confirms rather than challenges the prior conclusion. The package trades a solved problem for a bespoke one, paying in unfamiliarity, observability debt, single-maintainer risk, and now an explicit pull toward an EOL Symfony major. Recommend closing this evaluation. If Messenger semantics are a real requirement, escalate to a scoped assessment of symfony/redis-messenger with an explicit decision on whether to run Symfony Messenger alongside Laravel queues at all.
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.
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums
rlacerda83/query-parser
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings