Move any handler to async with one attribute. Atomic outbox in one DBAL transaction. Per-handler failure isolation. #[Delayed], #[Priority], #[TimeToLive] consistent across RabbitMQ, Kafka, SQS, Redis, DBAL, Messenger transports, and Laravel Queue channels — handler code is broker-agnostic.
Composer package · Laravel or Symfony · PostgreSQL or MySQL · RabbitMQ, Kafka, SQS, Redis, or DBAL outbox
RabbitMQ, Kafka, SQS, Redis, DBAL outbox. Move handlers to async with one attribute. CombinedMessageChannel writes the message in the same DBAL transaction as the business state, then dispatches execution to the broker. Atomic. Transports swap without code changes.
Transactional outbox, DBAL dead-letter queue with replay, retries with exponential backoff, deduplication, OpenTelemetry on every handler — default behaviour, not assembly required.
A copy of the message is dispatched to every handler. Each retries independently, fails independently — no shared envelope, no sibling re-runs. One failing subscriber doesn't abort the others.
First-party packages for RabbitMQ, Kafka, SQS, Redis, and DBAL. Ecotone fits your existing stack — no new cluster to operate, no migration of your message infrastructure.
Correlation IDs and parent-message IDs propagate from command to every emitted event without middleware. Your OpenTelemetry spans stitch themselves end-to-end — no bundle to install, no stamps to remember.
Each row names what you'd need to add to match Ecotone, and the architectural ceiling that integration cannot fix.
Retry is per-transport. No outbox primitive. Single-tenant per app.
Job runner. No command/event/query separation. No outbox. Horizon Redis-only.
From #[Asynchronous] on day one to multi-broker outbox at scale.
Haven’t found what you’re looking for? Contact us
Unleash the power of Messaging in PHP
and push productivity to the higher level
