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

Beanstalkd Messenger Laravel Package

symfony/beanstalkd-messenger

Symfony Messenger transport for Beanstalkd. Send and consume messages via Beanstalkd queues using a Messenger-compatible transport with DSN configuration and worker support, ideal for lightweight background job processing in Symfony apps.

Deep Wiki
Context7

Technical Evaluation

Verdict up front: this package solves a problem a Laravel application does not have, while introducing a second messaging paradigm alongside the one Laravel already ships. It is a credible, narrow, MIT-licensed bridge — but the burden of proof is on the use case, not on the package.

Architecture fit — poor by default, viable in one specific scenario

Laravel already has first-class Beanstalkd support through the beanstalkd queue driver (pda/pheanstalk under the hood). For the overwhelmingly common case — dispatch a job, run a worker, retry on failure — symfony/beanstalkd-messenger is functionally redundant and adds a parallel abstraction for the same broker.

The package is a transport bridge for Symfony Messenger, which is not a drop-in analog to Illuminate\Queue. Messenger is a message-bus library built around Envelope, Stamp, Middleware, SenderInterface/ReceiverInterface, and explicit routing configuration. Laravel's queue is a job-runner built around ShouldQueue, Job classes, and a dispatcher. They have different semantics for retries, failure handling, and middleware, and they do not share workers, dashboards, or failure storage. Adopting this package means running two message-processing stacks against one Beanstalkd instance, with two sets of retry policies and two definitions of "failed."

The scenario where it genuinely fits: an application that already uses Symfony Messenger (a shared library, a service extracted from a Symfony monolith, or a Laravel app deliberately adopting Messenger for bus semantics — middleware pipelines, stamps, per-message routing). In that case the package is the right shape, and it should be scoped to that bounded context only.

Integration feasibility — technically straightforward, organizationally awkward

Wiring is mechanical: require symfony/messenger plus this bridge, register the transport in a service provider, define a message bus, and run messenger:consume under Supervisor as a second worker tier. Messenger does not require the full Symfony framework or its DI container — buses and transports can be constructed manually — so there is no hard dependency on Symfony Kernel bootstrapping.

The friction is composer-level and conceptual, not architectural. Laravel pins Symfony components to matching major versions (symfony/console, symfony/http-foundation, symfony/process, etc.); the bridge's symfony/messenger constraint must co-resolve with whatever Laravel has locked. This is usually fine and occasionally a blocker.

Technical risk

Risk Severity Note
Two messaging paradigms in one codebase High Doubles the mental model for every engineer touching async work
Bus factor High 19 stars and a score of 18.4 are adoption signals, not quality signals — assume a single maintainer and no vendor SLA
Composer constraint conflict with Laravel's Symfony pins Medium Detectable in a spike; not a production surprise
Observability gap Medium No Horizon (Redis-only), no first-class Telescope surface; Beanstalkd tube stats are your only native signal
Beanstalkd as the substrate Medium Mature and stable, but limited HA story and persistence only when started with a binlog
Duplicate processing Medium At-least-once delivery plus TTR expiry means handlers must be idempotent regardless of package quality

Key questions before committing

  1. Do we already run Symfony Messenger anywhere, or is this package the reason we would start?
  2. Which specific Messenger capability do we need that Laravel's queue cannot express — middleware, stamps, routing, or a shared message contract with a non-Laravel service?
  3. Who owns Beanstalkd operationally, and is it already in our infrastructure or would this introduce it?
  4. What is the maintainer's release cadence and issue-response history? Is there a fork-and-vendor plan if this becomes load-bearing?
  5. Does the package's symfony/messenger constraint resolve cleanly against our current Laravel lockfile?
  6. Is there a known exit path — could we swap the transport for AMQP or Redis without rewriting handlers?

Integration Approach

Stack fit

Treat this as an isolation-layer component, not a platform component. It belongs in a single bounded context that speaks Messenger, behind an explicit transport configuration, with no expectation that the rest of the Laravel app adopts Messenger. Do not let it become the default async mechanism.

If the requirement is merely "run background jobs on Beanstalkd," stop here and use the native beanstalkd queue driver. The integration cost of this package is only justified when Messenger semantics are the actual requirement.

Migration path

Three plausible entry points, in descending order of justification:

  • Already on Messenger elsewhere. Adopt directly, scope to the shared-contract messages, run messenger:consume as a separate Supervisor program group. Lowest risk, clear boundary.
  • Migrating a service into a Laravel monolith that already uses Messenger. Keep the Messenger bus for the imported context; do not translate handlers into Laravel jobs during the migration — that is a rewrite disguised as a port. Revisit after stabilization.
  • Greenfield Beanstalkd queueing. Do not adopt. Native driver, fewer moving parts, Horizon-equivalent tooling available elsewhere and full Telescope coverage.

Compatibility

Validate in a throwaway branch before committing to a design: composer require symfony/messenger symfony/beanstalkd-messenger against the current lockfile, confirm resolution, then boot a trivial message through a real Beanstalkd instance. This is a half-day spike and it de-risks the entire decision. Confirm the PHP version floor against our runtime and confirm which Messenger major the bridge targets — Messenger's internals (retry strategy, transport interfaces) have moved across majors.

Sequencing

  1. Spike (0.5 day): composer resolution + end-to-end message round-trip on a local Beanstalkd.
  2. Pilot (1 sprint): one low-consequence queue — notifications or non-critical enrichment — running in a non-production environment with production-shaped volume.
  3. Observability before production: tube depth, buried-job count, and consumer liveness metrics wired into existing alerting. Do not proceed without this.
  4. Production, single tube: Supervisor-managed messenger:consume, one bounded context, documented as the only Messenger surface.
  5. Explicit stop. Do not expand to additional contexts without a second review; the failure mode is paradigm creep.

The native Laravel queue continues to own everything else. Two worker tiers is the steady-state target, not a transitional one.

Operational Impact

Maintenance

The realistic assumption is a single-maintainer, low-adoption package. That is acceptable for a transport shim (small surface area, stable protocol) but not for anything load-bearing without a contingency. Because the license is MIT, the contingency is straightforward: vendor the package into the repository or maintain a fork if upstream goes quiet. Budget for that as a known, low-probability cost rather than discovering it during an incident.

Upgrade cadence is tied to symfony/messenger majors, which are on a predictable annual rhythm. Expect a forced review roughly yearly, coordinated with Laravel's own Symfony component bumps.

Support

No vendor, no SLA, GitHub issues only. Internal ownership must be explicit — a named team responsible for the Messenger tier, its Supervisor configs, and its runbook. Unowned second worker tiers are how organizations end up with silently buried jobs.

Scaling

Beanstalkd scales vertically well and horizontally through tubes: partition work by tube, run dedicated consumer pools per tube. That is a real and usable lever. What it does not give you is the operational surface Laravel teams expect — no Horizon dashboard, no per-queue throughput UI, no retry button. Consumer scaling is just more Supervisor processes, which is fine but manual.

The larger scaling concern is human: every new engineer now needs Laravel queue concepts and Messenger concepts. That tax is paid on every async code review, permanently, for as long as both stacks exist.

Failure modes to design for

  • Buried jobs accumulate silently. Beanstalkd buries jobs that exceed retry limits; without a dashboard these vanish. Alert on buried count per tube from day one.
  • TTR expiry causes duplicate execution. A handler exceeding its time-to-run gets reserved by a second worker. Handlers must be idempotent — this is a Messenger/Beanstalkd property, not a package defect, and it will bite.
  • Beanstalkd restart loses in-flight work unless started with a binlog. Confirm the persistence configuration before the pilot, not after.
  • Long-running consumer memory growth. messenger:consume supports a message/time limit; configure it and let Supervisor recycle. Same discipline as queue:work --max-time, and equally easy to forget.
  • Split-brain failure semantics. A job that fails in the Messenger tier and a job that fails in the Laravel tier are recorded in different places with different retry counts. Incident response must know which tier a given piece of work lives in.

Ramp-up

Two to three weeks for a competent Laravel engineer to become productive with Messenger's envelope/stamp/middleware model, plus whatever time is needed to learn Beanstalkd operations (tubes, TTR, bury/kick, binlog). Neither is hard; both are new. Plan the ramp into the pilot sprint rather than assuming it happens in the cracks.

Bottom line for the roadmap: approve only as a scoped transport for an existing Messenger requirement, with a named owner, observability wired before production, and a documented fork contingency. Reject as a general-purpose Beanstalkd integration — Laravel already has one, and it comes with the rest of the framework attached.

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.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast