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, Symfony, or Tempest · 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 forwards it to the broker for consumers to handle — an atomic outbox, so a broker outage can't lose it. Delivery is at-least-once, and built-in deduplication makes redelivery safe. 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 tool below is a capable choice for its slice. Ecotone covers the same ground and adds the operational layer around it — so aggregates, projections, sagas, and messaging share one model and one set of guarantees.
A mature dispatch and transport layer.
Where Ecotone goes further than this library
CombinedMessageChannel) — the message is committed to the database with the business write, then handled by consuming from the broker.#[Delayed], #[Priority], and #[TimeToLive] attribute model works the same across RabbitMQ, SQS, Redis, and DBAL.A robust job runner with an excellent operational UI.
Where Ecotone goes further than this library
#[Priority] / #[Delayed] / #[TimeToLive] model above the transport.From #[Asynchronous] on day one to multi-broker outbox at scale.
#[Asynchronous('channel')] moves any handler to async — the same handler code runs on RabbitMQ, Apache Kafka, Amazon SQS, Redis, DBAL, Symfony Messenger transports, or Laravel Queue channels.CombinedMessageChannel splits outbox storage from execution: the database holds the outbox (one poller drains it), the broker carries execution (consumers scale horizontally).#[Delayed], #[Priority], #[TimeToLive], and scheduled messages have one consistent attribute model across brokers.#[Asynchronous] model composes every building block — run a projection asynchronously, route commands and events across applications with the Distributed Bus, or build pipe-and-filter flows from chained handlers — one channel model, not a different mechanism for each.Haven’t found what you’re looking for? Contact us
Unleash the power of Messaging in PHP
and push productivity to the higher level
