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 Azure Service Bus Messenger Bundle Laravel Package

halloverden/symfony-azure-service-bus-messenger-bundle

This Symfony bundle integrates Azure Service Bus with Symfony Messenger, providing a transport for sending and receiving messages via Azure queues or topics so Symfony apps can use Azure-backed asynchronous messaging.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit: conditional at best — and only if you first acknowledge that "Laravel" and "this package" do not meet. The bundle registers an Azure Service Bus transport with Symfony Messenger's transport registry. Laravel does not use Messenger; it uses Illuminate\Contracts\Queue\Queue with connectors registered via Queue::extend() and workers driven by queue:work/Horizon. There is no shared extension point. So the honest framing for a TPM is: this is not a Laravel dependency, it is a Symfony dependency that a Laravel team can read, borrow from, or run beside its own queue system out-of-process. Three shapes are possible and only one is strategically sound:

Shape What it means TPM verdict
Install symfony/messenger + this bundle inside a Laravel app Two parallel messaging runtimes, two worker supervisors, two retry/failure models Reject — doubles the operational surface for zero product gain
Port the transport logic into a native Laravel connector ~300–500 lines against the same Azure SDK; keeps dispatch(), failed_jobs, Horizon Preferred — best effort/ownership ratio
Confine Service Bus to the integration boundary Laravel queues internally, a small dedicated consumer/publisher service at the edge Fallback — correct when the boundary is genuinely cross-system

Integration feasibility: low as a dependency, moderate as a specification. The package's genuine value to a Laravel org is as a worked reference for Azure Service Bus wire semantics — entity naming, peek-lock and settlement calls, lock-renewal behaviour, dead-letter conventions, header/stamp mapping. That is a 1–2 week read-and-port exercise, not an install. Installing it directly imports an entire second messaging programming model into a codebase that has no reason to host one.

Technical risk: high, and concentrated in three places.

  • Maturity. 2 stars, 0 dependents, score 0.17, effectively a single maintainer, no downstream projects to inherit fixes from. MIT licensing gives you legal freedom, not continuity. There is no production validation signal here of any kind.
  • Transport mechanism is unknown and it dominates cost/latency. Azure Service Bus is AMQP 1.0; ext-amqp is 0.9.1 and incompatible. Most PHP clients therefore fall back to the REST/poll path, which means higher delivery latency, per-operation billing exposure, and hand-rolled lock renewal. Whether this bundle uses a REST-poll client or an AMQP-capable one is the single most important unknown in this evaluation — it changes both the SLO story and the Azure bill.
  • Semantics mismatch under load. Messenger's retry + failure-transport model and Laravel's failed_jobs/retry_after model are not equivalent. Mixing them yields ambiguous redelivery behaviour that surfaces during incidents, which is the worst possible time to discover it.

Key questions to resolve before any commitment (spike output, not vendor answers — there is no vendor):

  1. Which Azure SDK does it wrap, and is the wire path AMQP 1.0 or REST polling? Observed p50/p99 latency and messages/sec per worker?
  2. How is peek-lock renewed for long-running handlers, and is there a max-lock guard?
  3. Coverage of sessions (ordered delivery), scheduled/deferred messages, transactions, batch receive, correlation filters on subscriptions, and programmatic dead-letter replay?
  4. Tested compatibility matrix: Symfony Messenger version, PHP version, Azure SDK version — and is it pinned or floating?
  5. Dead-letter and poison-message path: max-delivery-count, and can it be made observable in our existing dashboards?
  6. Does the REST path bill per operation in a way that breaks our cost model at target volume?
  7. Maintainer identity and any commitment beyond "works for us" — because we are effectively underwriting this code either way.

Integration Approach

Stack fit. Assume Laravel 10–12, PHP 8.1+, an existing internal queue (Redis, database, or SQS) that is not going away. Azure Service Bus is almost certainly being introduced for cross-system messaging — partner integration, Azure-hosted services, event fan-out — not to replace internal job queues. That framing is decisive: it argues for the boundary/connector shapes above, and against adopting a second in-process messaging framework.

Migration path.

  1. Spike, timeboxed (1–2 weeks). Stand up a Service Bus namespace, one queue and one topic/subscription. Install the bundle in a throwaway Symfony skeleton — not in the Laravel app — purely to read the transport implementation and confirm the AMQP-vs-REST question with real measurements. Deliverable is a one-page semantics memo, not a working integration.
  2. Decide build vs. boundary. If the semantics prove thin and the client is REST-poll, write the Laravel connector against the same Azure SDK. You inherit Laravel's worker, failed_jobs table, backoff configuration, and existing observability, and you eliminate dual-runtime drift entirely.
  3. If a bounded context genuinely needs Messenger semantics, isolate it as a separate deployment unit and prohibit direct dispatch() from Laravel into it — bridge via HTTP or a transactional outbox.
  4. Outbox for anything loss-sensitive. Write the intent to a DB table in the same transaction as the domain change; relay asynchronously to Service Bus. This is non-negotiable if the message triggers money movement or a customer-visible action.

Compatibility. Prefer vendoring the transport logic over depending on the package — you sidestep the Symfony version-constraint surface entirely (Laravel already pins many symfony/* packages, and conflicts surface late, at composer update). If you must depend on it, pin exact versions and add a composer why-not gate to CI.

Sequencing. SDK evaluation → transport-semantics spike → build-vs-boundary decision → outbox + relay → one non-critical queue in production → expand. Nothing revenue-path until it has run clean for a full quarter.

Operational Impact

Maintenance. This is the dominant cost and the reason to fork rather than follow. A 0.17-scored, single-maintainer package will not track Azure SDK or Symfony releases on your cadence. Budget an internal fork with a named owner, plus a small allowance per Symfony major upgrade and per Azure SDK breaking change. If you take the connector route, that maintenance obligation is yours by design — which is cheaper than inheriting it accidentally.

Support. No vendor, no SLA, no community to escalate to. Microsoft supports the Service Bus service, not this client. Your escalation path is "read the source," so the source must be internalized before go-live — an on-call engineer at 3 a.m. cannot file a GitHub issue against a two-star repo and wait.

Scaling. With a REST-poll transport, scaling means more worker processes → more REST operations/day → more cost and more consumption of namespace throughput units. Model this explicitly: messages/sec × poll frequency × operations-per-message against the Service Bus tier's operation allowance, then re-check with prefetch and batch settings. Sessions (if supported at all) serialize consumption and cap per-session throughput — verify before designing anything order-dependent, because that constraint is architectural, not tunable.

Failure modes to instrument from day one:

  • Lock expiry / duplicate delivery — peek-lock not renewed mid-handler; message redelivered while still processing. Requires idempotent handlers, not merely retries.
  • Poison messages — need a max-delivery-count and a dead-letter dashboard. Laravel's failed_jobs view will not show Service Bus dead letters; if you don't build the view, nobody sees them.
  • Credential/connection expiry — managed identity vs. SAS rotation; the classic symptom is a silently stalled consumer with green health checks.
  • Silent consumer death — no Horizon-equivalent supervisor visibility for an external consumer; add heartbeat and lag alerting by hand.
  • Dual-runtime drift — two failure semantics in one system splits the incident runbook in two, usually discovered mid-incident.

Ramp-up. Realistically 2–4 weeks before the team is independently productive, on top of the spike. Engineers need working knowledge of Azure Service Bus concepts (entities, peek-lock, sessions, duplicate detection, dead-lettering) and, if the bundle is adopted, Messenger's middleware/stamp model. The connector route reduces this to Azure concepts alone — a genuine, quantifiable argument in its favour.

Bottom line for a TPM. Do not adopt this package as a Laravel dependency; the score, the zero-dependents signal, the bus factor, and the framework mismatch each independently disqualify it from anything on a critical path. Leverage it the way a TPM can actually justify: fund a two-week spike that treats it as a specification for Azure Service Bus semantics, then commit to either a thin Laravel connector or a boundary-plus-outbox design. The Azure Service Bus decision may well be sound for your organization; this package is not the vehicle for executing it.

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.
dakiquang/laravel-oauth-refresh-lock
woda/laravel-worktrees
dalefranks/ramasite
faghy/laracashbook
roundly-consulting/google-places-for-laravel
roundly-consulting/kubernetes-api-for-laravel
roundly-consulting/plausible-for-laravel
gvp/gvp-laravel-template
metasyncsite/laravel-metasync-client
roundly-consulting/onboarding-for-laravel
andydefer/laravel-notification
adachsoft/cli-process-tester
jhaskell13/laraflow
sebastienheyd/boilerplate-media-manager
ccast/tagixo-primix
pretendtrue/laravel-builder
sawmainek/laravel-scout-tntsearch-driver
tomshaw/laravel-calendar-table
dibakar/laravel-ownership
adachsoft/changelog-linter