From 717486264ddca66c46297cdb42881806f17401fc Mon Sep 17 00:00:00 2001 From: Dariusz Gafka Date: Fri, 22 May 2026 17:12:04 +0200 Subject: [PATCH] feat: update docs --- README.md | 11 +++- composer.json | 14 ++++- packages/Amqp/README.md | 2 +- packages/Amqp/composer.json | 11 ++-- packages/DataProtection/README.md | 2 +- packages/DataProtection/composer.json | 12 ++-- packages/Dbal/README.md | 7 ++- packages/Dbal/composer.json | 11 +++- packages/Ecotone/README.md | 27 +++++---- packages/Ecotone/composer.json | 11 +++- packages/Enqueue/README.md | 2 +- packages/Enqueue/composer.json | 7 ++- packages/JmsConverter/README.md | 2 +- packages/JmsConverter/composer.json | 2 + packages/Kafka/README.md | 2 +- packages/Kafka/composer.json | 8 ++- packages/Laravel/README.md | 4 +- packages/Laravel/composer.json | 15 +++-- packages/LiteApplication/README.md | 4 +- packages/LiteApplication/composer.json | 15 +++-- packages/OpenTelemetry/README.md | 2 +- packages/OpenTelemetry/composer.json | 8 ++- packages/PdoEventSourcing/README.md | 5 +- packages/PdoEventSourcing/composer.json | 15 ++++- packages/Redis/README.md | 2 +- packages/Redis/composer.json | 6 +- packages/Sqs/README.md | 2 +- packages/Sqs/composer.json | 9 ++- packages/Symfony/README.md | 4 +- packages/Symfony/composer.json | 15 +++-- shared-channels.md | 81 ------------------------- 31 files changed, 163 insertions(+), 155 deletions(-) delete mode 100644 shared-channels.md diff --git a/README.md b/README.md index e4108e54b..51c8ac1a9 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,16 @@ class NotificationService Every flow — sync, async, sagas, projections — runs through the same messaging pipeline in production and in tests. Swap the in-memory channel for RabbitMQ, Kafka, SQS, Redis, or DBAL in production; the test shape never changes. -Visit [ecotone.tech](https://ecotone.tech) to learn more. +## Topic deep dives + +- [Durable Workflows in PHP](https://ecotone.tech/durable-workflows) — long-running processes, sagas, orchestrators, event-sourced replay on your existing DB + broker +- [Event Sourcing in PHP](https://ecotone.tech/event-sourcing) — built-in event store, projections (catch-up, partitioned, streaming), blue-green rebuilds, PII encryption end-to-end +- [Asynchronous Communication](https://ecotone.tech/asynchronous-communication) — message channels, retries, outbox, delayed messages, scheduling, dead letter with replay +- [Domain-Driven Design in PHP](https://ecotone.tech/domain-driven-design) — aggregates, repositories, domain events, sagas — all via attributes +- [Orchestration Layer](https://ecotone.tech/orchestration-layer) — declarative multi-step workflows, EIP routing, dynamic step lists +- [Microservices](https://ecotone.tech/microservices) — Distributed Bus, Service Map, multi-broker single topology + +Visit [ecotone.tech](https://ecotone.tech) for the full overview. > Works with [Symfony](https://docs.ecotone.tech/modules/symfony-ddd-cqrs-event-sourcing), [Laravel](https://docs.ecotone.tech/modules/laravel-ddd-cqrs-event-sourcing), or any PSR-11 framework via [Ecotone Lite](https://docs.ecotone.tech/install-php-service-bus#install-ecotone-lite-no-framework). diff --git a/composer.json b/composer.json index f0d94139c..08e8e852c 100644 --- a/composer.json +++ b/composer.json @@ -15,11 +15,19 @@ "keywords": [ "ddd", "cqrs", - "EventSourcing", + "event-sourcing", + "sagas", + "durable-workflows", + "durable-execution", + "workflow", + "outbox", + "projections", "ecotone", - "service-bus" + "service-bus", + "message-driven", + "event-driven" ], - "description": "Enterprise architecture layer for Laravel and Symfony — CQRS, Event Sourcing, Sagas, Projections, Workflows, and Outbox messaging via PHP attributes.", + "description": "Enterprise architecture layer for Laravel and Symfony — CQRS, Event Sourcing, Durable Workflows (Sagas, Orchestrators), Projections, and Outbox messaging via PHP attributes.", "repositories": [ { "type": "path", diff --git a/packages/Amqp/README.md b/packages/Amqp/README.md index 7ce3bb5c0..f4436cd51 100644 --- a/packages/Amqp/README.md +++ b/packages/Amqp/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## AMQP / RabbitMQ transport -Route `#[Asynchronous]` handlers to RabbitMQ. Exchanges, queues, and bindings are declared from your PHP configuration, and every message flows through Ecotone's standard retry, outbox, and dead letter pipeline — so switching to AMQP in production never changes how your handlers or tests are written. +Route `#[Asynchronous]` handlers to RabbitMQ. Exchanges, queues, and bindings are declared from your PHP configuration, and every message flows through Ecotone's standard [retry, outbox, and dead letter pipeline](https://docs.ecotone.tech/solutions/unreliable-async-processing) — so switching to AMQP in production never changes how your handlers or tests are written. Carries [asynchronous communication](https://ecotone.tech/asynchronous-communication), [durable workflow](https://ecotone.tech/durable-workflows) execution, and [cross-service distribution](https://ecotone.tech/microservices) on the same broker. Supports both implementations: diff --git a/packages/Amqp/composer.json b/packages/Amqp/composer.json index 5a6a1ebff..911cdf067 100644 --- a/packages/Amqp/composer.json +++ b/packages/Amqp/composer.json @@ -20,12 +20,13 @@ "rabbitmq", "rabbit", "messaging", - "asynchronous", - "message", - "enterprise integration patterns", + "async-messaging", + "message-broker", "eip", - "distributed architecture", - "domain driven design" + "ecotone", + "outbox", + "durable-workflows", + "saga" ], "description": "AMQP / RabbitMQ transport for Ecotone asynchronous messaging, outbox, and dead letter.", "repositories": [ diff --git a/packages/DataProtection/README.md b/packages/DataProtection/README.md index c6f1aa649..9500007fd 100644 --- a/packages/DataProtection/README.md +++ b/packages/DataProtection/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Data Protection -Attribute-driven encryption and PII masking for Ecotone messages. Mark sensitive fields on commands, events, or queries and Ecotone handles protection transparently — in message channels, event stores, dead letter queues, and traces — without changing your handler code. +Attribute-driven encryption and PII masking for Ecotone messages. Mark sensitive fields on commands, events, or queries and Ecotone handles protection transparently — in [message channels](https://ecotone.tech/asynchronous-communication), [event stores](https://ecotone.tech/event-sourcing), dead letter queues, and traces — without changing your handler code. See the [Data Protection module docs](https://docs.ecotone.tech/modules/data-protection) for setup and key management. - **Field-level encryption** — sensitive fields encrypted in transit and at rest - **PII masking** — configurable masking for logs and traces diff --git a/packages/DataProtection/composer.json b/packages/DataProtection/composer.json index c902173d9..782d84a77 100644 --- a/packages/DataProtection/composer.json +++ b/packages/DataProtection/composer.json @@ -17,10 +17,14 @@ ], "keywords": [ "ecotone", - "Encryption", - "OpenSSL", - "Sensitive Data Protection", - "Secure Messages" + "encryption", + "pii", + "gdpr", + "data-protection", + "crypto-shredding", + "openssl", + "sensitive-data", + "secure-messages" ], "description": "Field-level encryption and PII masking for Ecotone messages \u2014 GDPR-friendly data protection with crypto-shredding.", "repositories": [ diff --git a/packages/Dbal/README.md b/packages/Dbal/README.md index edc2b10eb..9e588716a 100644 --- a/packages/Dbal/README.md +++ b/packages/Dbal/README.md @@ -17,11 +17,12 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Doctrine DBAL integration -Database-backed foundation for Ecotone, built on Doctrine DBAL. Use your existing relational database as a message transport, outbox, or dead letter store — no extra infrastructure required to get started. +Database-backed foundation for Ecotone, built on Doctrine DBAL. Use your existing relational database as a [message transport](https://ecotone.tech/asynchronous-communication), outbox, dead letter store, or [durable saga state](https://ecotone.tech/durable-workflows) — no extra infrastructure required to get started. -- **DBAL message channel** — durable asynchronous channel backed by your database -- **Outbox pattern** — atomic commit of business state and outbound messages, so no event is lost on crash +- **DBAL message channel** — durable [asynchronous channel](https://ecotone.tech/asynchronous-communication) backed by your database +- **Outbox pattern** — atomic commit of business state and outbound messages, so no event is lost on crash ([details](https://docs.ecotone.tech/solutions/unreliable-async-processing)) - **Dead Letter Queue** — failed messages persisted to your database, inspectable and replayable +- **Saga state storage** — non-event-sourced sagas persist their state per `#[Identifier]` in your DB - **Document Store** — aggregates persisted as JSON documents, no ORM required - **Business Interfaces** — declarative DBAL query methods via `#[DbalBusinessMethod]` - **Transactional message handling** — each handler wrapped in a DB transaction automatically diff --git a/packages/Dbal/composer.json b/packages/Dbal/composer.json index 2fbc73100..5aad99848 100644 --- a/packages/Dbal/composer.json +++ b/packages/Dbal/composer.json @@ -17,9 +17,16 @@ ], "keywords": [ "dbal", - "ecotone" + "doctrine", + "ecotone", + "outbox", + "dead-letter-queue", + "messaging", + "saga", + "durable-workflows", + "document-store" ], - "description": "Doctrine DBAL integration for Ecotone \u2014 database-backed message channel, outbox pattern, dead letter queue, and document store.", + "description": "Doctrine DBAL integration for Ecotone \u2014 database-backed message channel, outbox pattern, dead letter queue, durable saga state storage, and document store.", "repositories": [ { "type": "path", diff --git a/packages/Ecotone/README.md b/packages/Ecotone/README.md index 7c87ae695..8543c16b4 100644 --- a/packages/Ecotone/README.md +++ b/packages/Ecotone/README.md @@ -102,17 +102,20 @@ Swap the in-memory channel for DBAL, RabbitMQ, or Kafka in production — the te ## What's in the box -| Area | What you get | -|---|---| -| **Messaging** | Command / Query / Event buses, routing, interceptors, business interfaces (gateways) | -| **Domain modelling** | Aggregates, Sagas, state-stored or event-sourced — all via attributes | -| **Event Sourcing** | Event Store, Projections (catch-up, partitioned, streaming), event versioning and upcasting, DCB | -| **Workflows** | Stateless workflows, orchestrators (routing slip), saga-based process managers | -| **Async & resiliency** | `#[Asynchronous]`, retries, error channels, dead letter queue with replay, Outbox pattern | -| **Observability** | OpenTelemetry tracing, Service Map (Enterprise) | -| **Multi-tenancy** | Per-tenant connections, event stores, and async channels | -| **Distribution** | Distributed Bus for cross-service events and commands | -| **Data protection** | Field-level encryption and PII masking for messages | +| Area | What you get | Deep dive | +|---|---|---| +| **Messaging** | Command / Query / Event buses, routing, interceptors, business interfaces (gateways) | [docs](https://docs.ecotone.tech/modelling/command-handling) | +| **Domain modelling** | Aggregates, Sagas, state-stored or event-sourced — all via attributes | [ecotone.tech/domain-driven-design](https://ecotone.tech/domain-driven-design) | +| **Event Sourcing** | Event Store, Projections (catch-up, partitioned, streaming), event versioning and upcasting, snapshots | [ecotone.tech/event-sourcing](https://ecotone.tech/event-sourcing) | +| **Durable Workflows** | Stateless workflows, sagas, orchestrators (routing slip), event-sourced sagas with full replay — long-running processes that survive crashes, deploys, and restarts on the DB + broker you already run | [ecotone.tech/durable-workflows](https://ecotone.tech/durable-workflows) | +| **Asynchronous communication** | `#[Asynchronous]`, message channels, delayed messages, scheduling, priority, TTL, dynamic channels | [ecotone.tech/asynchronous-communication](https://ecotone.tech/asynchronous-communication) | +| **Resiliency** | Retries, error channels, dead letter queue with replay, Outbox pattern, deduplication | [docs](https://docs.ecotone.tech/solutions/unreliable-async-processing) | +| **Orchestration** | EIP routing, splitters, filters, transformers, multi-step orchestrators (Enterprise) | [ecotone.tech/orchestration-layer](https://ecotone.tech/orchestration-layer) | +| **Observability** | OpenTelemetry tracing, Service Map (Enterprise) | [docs](https://docs.ecotone.tech/modules/opentelemetry-tracing-and-metrics) | +| **Multi-tenancy** | Per-tenant connections, event stores, and async channels | [docs](https://docs.ecotone.tech/messaging/multi-tenancy-support) | +| **Distribution** | Distributed Bus for cross-service events and commands | [ecotone.tech/microservices](https://ecotone.tech/microservices) | +| **Data protection** | Field-level encryption and PII masking for messages | [docs](https://docs.ecotone.tech/modules/data-protection) | +| **Testing** | `EcotoneLite::bootstrapFlowTesting` — full flows in-process, no broker required | [docs](https://docs.ecotone.tech/modelling/testing-support) | --- @@ -181,4 +184,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor: ## Tags -PHP, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Symfony, Laravel, Service Bus, Event Driven Architecture +PHP, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Durable Execution, Workflows, Orchestrator, Outbox, Symfony, Laravel, Service Bus, Event Driven Architecture diff --git a/packages/Ecotone/composer.json b/packages/Ecotone/composer.json index 6b5568710..e00257de8 100644 --- a/packages/Ecotone/composer.json +++ b/packages/Ecotone/composer.json @@ -18,14 +18,19 @@ "keywords": [ "ddd", "cqrs", - "EventSourcing", + "event-sourcing", + "sagas", + "durable-workflows", + "durable-execution", + "workflow", + "outbox", + "projections", "ecotone", "service-bus", "message-driven", - "event", "event-driven" ], - "description": "Enterprise architecture layer for Laravel and Symfony \u2014 CQRS, Event Sourcing, Sagas, Projections, Workflows, and Outbox messaging via PHP attributes.", + "description": "Enterprise architecture layer for Laravel and Symfony \u2014 CQRS, Event Sourcing, Durable Workflows (Sagas, Orchestrators), Projections, and Outbox messaging via PHP attributes.", "repositories": [ { "type": "path", diff --git a/packages/Enqueue/README.md b/packages/Enqueue/README.md index 6f2ef5d1f..2b664472c 100644 --- a/packages/Enqueue/README.md +++ b/packages/Enqueue/README.md @@ -19,7 +19,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr Shared adapter layer between Ecotone and [Enqueue](https://github.com/php-enqueue/enqueue) — the PHP messaging abstraction used by Ecotone's AMQP, Redis, and SQS transports. You typically don't install this package directly; it's pulled in by whichever transport package you use. -Install it directly only when building a custom Enqueue-backed transport (e.g., Stomp, Gearman, Beanstalkd) and integrating it with Ecotone's channel and consumer lifecycle. +Install it directly only when building a custom Enqueue-backed transport (e.g., Stomp, Gearman, Beanstalkd) and integrating it with Ecotone's channel and consumer lifecycle — useful for [asynchronous communication](https://ecotone.tech/asynchronous-communication) on a broker Ecotone doesn't ship a dedicated package for. Visit [ecotone.tech](https://ecotone.tech) to learn more. diff --git a/packages/Enqueue/composer.json b/packages/Enqueue/composer.json index a2953ad25..00468884e 100644 --- a/packages/Enqueue/composer.json +++ b/packages/Enqueue/composer.json @@ -17,7 +17,12 @@ ], "keywords": [ "enqueue", - "ecotone" + "ecotone", + "message-broker", + "async-messaging", + "amqp", + "sqs", + "redis" ], "description": "Enqueue adapter layer for Ecotone \u2014 shared base for AMQP, Redis, and SQS transports.", "repositories": [ diff --git a/packages/JmsConverter/README.md b/packages/JmsConverter/README.md index adfc4ceba..a3119ac98 100644 --- a/packages/JmsConverter/README.md +++ b/packages/JmsConverter/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## JMS Serializer media type converter -Integration between Ecotone's media type converter system and [JMS Serializer](https://github.com/schmittjoh/serializer). Use JMS annotations to control serialization of commands, events, and query responses — custom naming, groups, type handlers — when Ecotone's default converter isn't enough. +Integration between Ecotone's [media type converter system](https://docs.ecotone.tech/messaging/conversion/conversion) and [JMS Serializer](https://github.com/schmittjoh/serializer). Use JMS annotations to control serialization of commands, events, and query responses — custom naming, groups, type handlers — when Ecotone's default converter isn't enough. Typical reasons to reach for this: diff --git a/packages/JmsConverter/composer.json b/packages/JmsConverter/composer.json index 22be50cdb..2a30cf0bf 100644 --- a/packages/JmsConverter/composer.json +++ b/packages/JmsConverter/composer.json @@ -19,6 +19,8 @@ "messaging", "ecotone", "serializer", + "jms", + "jms-serializer", "integration", "json", "xml", diff --git a/packages/Kafka/README.md b/packages/Kafka/README.md index 19b2e4558..552d5fda6 100644 --- a/packages/Kafka/README.md +++ b/packages/Kafka/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Apache Kafka transport -Route `#[Asynchronous]` handlers to Kafka topics with partition-aware consumers and the same retry, outbox, and dead letter semantics as every other Ecotone transport. Publish from one service and consume in another via the Distributed Bus — switching transports never changes how your handlers or tests are written. +Route `#[Asynchronous]` handlers to Kafka topics with partition-aware consumers and the same [retry, outbox, and dead letter semantics](https://docs.ecotone.tech/solutions/unreliable-async-processing) as every other Ecotone transport. Publish from one service and consume in another via the [Distributed Bus](https://ecotone.tech/microservices) — switching transports never changes how your handlers or tests are written. Carries [asynchronous communication](https://ecotone.tech/asynchronous-communication) and [durable workflow](https://ecotone.tech/durable-workflows) execution on the same broker. - **Partitioned consumers** — ordering guarantees per key - **Consumer groups** — scale out horizontally diff --git a/packages/Kafka/composer.json b/packages/Kafka/composer.json index eab6b31b6..b2125f0c4 100644 --- a/packages/Kafka/composer.json +++ b/packages/Kafka/composer.json @@ -16,7 +16,13 @@ ], "keywords": [ "ecotone", - "Kafka" + "kafka", + "apache-kafka", + "streaming", + "message-broker", + "async-messaging", + "distributed-bus", + "event-streaming" ], "description": "Apache Kafka transport for Ecotone asynchronous messaging and Distributed Bus.", "repositories": [ diff --git a/packages/Laravel/README.md b/packages/Laravel/README.md index b3c5bd135..e7766745e 100644 --- a/packages/Laravel/README.md +++ b/packages/Laravel/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Ecotone for Laravel -Laravel handles HTTP beautifully. But the moment you need Event Sourcing, Sagas, or multi-step workflows, you're stitching packages together. Ecotone gives you one coherent toolkit — Aggregates, Projections, Outbox, and more — all attribute-driven, all testable in-process, all running on the Laravel queues you already have. +Laravel handles HTTP beautifully. But the moment you need [Event Sourcing](https://ecotone.tech/event-sourcing), [Sagas, or multi-step workflows](https://ecotone.tech/durable-workflows), you're stitching packages together. Ecotone gives you one coherent toolkit — Aggregates, Projections, [Outbox](https://docs.ecotone.tech/solutions/unreliable-async-processing), and more — all attribute-driven, all testable in-process, all running on the Laravel queues you already have. - **Works with Eloquent and Doctrine** - **Laravel Queue integration** — use your existing queue drivers @@ -64,4 +64,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor: ## Tags -PHP, Laravel, Eloquent, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Service Bus, Laravel Queue +PHP, Laravel, Eloquent, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Workflows, Outbox, Service Bus, Laravel Queue diff --git a/packages/Laravel/composer.json b/packages/Laravel/composer.json index 9ff2d4746..b5b114095 100644 --- a/packages/Laravel/composer.json +++ b/packages/Laravel/composer.json @@ -18,13 +18,18 @@ "keywords": [ "ddd", "cqrs", - "messaging", - "eip", - "distributed architecture", + "laravel", + "laravel-queue", + "event-sourcing", + "sagas", + "durable-workflows", + "workflow", + "outbox", "ecotone", - "ddd and cqrs on top of eip" + "messaging", + "eip" ], - "description": "Ecotone for Laravel \u2014 CQRS, Event Sourcing, Sagas, and Workflows on top of Laravel Queue, via PHP attributes.", + "description": "Ecotone for Laravel \u2014 CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.", "repositories": [ { "type": "path", diff --git a/packages/LiteApplication/README.md b/packages/LiteApplication/README.md index 15d6f5a4d..581754a5f 100644 --- a/packages/LiteApplication/README.md +++ b/packages/LiteApplication/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Ecotone Lite — framework-agnostic -Not on Laravel or Symfony? Ecotone Lite integrates with your existing PSR-11 container to provide Command, Event, and Query buses — plus the full feature set of Aggregates, Sagas, Projections, and Event Sourcing. Same attributes, same testing, same architecture. +Not on Laravel or Symfony? Ecotone Lite integrates with your existing PSR-11 container to provide Command, Event, and Query buses — plus the full feature set of [Aggregates](https://ecotone.tech/domain-driven-design), [Sagas and durable workflows](https://ecotone.tech/durable-workflows), Projections, and [Event Sourcing](https://ecotone.tech/event-sourcing). Same attributes, same testing, same architecture. - **Any PSR-11 container** - **Full feature set available** — nothing framework-specific is held back @@ -60,4 +60,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor: ## Tags -PHP, PSR-11, Ecotone Lite, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Service Bus +PHP, PSR-11, Ecotone Lite, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Workflows, Outbox, Service Bus diff --git a/packages/LiteApplication/composer.json b/packages/LiteApplication/composer.json index e63cb291d..95fe482ff 100644 --- a/packages/LiteApplication/composer.json +++ b/packages/LiteApplication/composer.json @@ -16,15 +16,18 @@ } ], "keywords": [ + "ecotone", + "ecotone-lite", + "psr-11", "ddd", "cqrs", - "messaging", - "eip", - "distributed architecture", - "ecotone", - "ddd and cqrs on top of eip" + "event-sourcing", + "sagas", + "durable-workflows", + "workflow", + "framework-agnostic" ], - "description": "Ecotone Lite \u2014 framework-agnostic bootstrap for PSR-11 applications with CQRS, Event Sourcing, Sagas, and Workflows.", + "description": "Ecotone Lite \u2014 framework-agnostic bootstrap for PSR-11 applications with CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox.", "repositories": [ { "type": "path", diff --git a/packages/OpenTelemetry/README.md b/packages/OpenTelemetry/README.md index eaccd35d2..57d0c6319 100644 --- a/packages/OpenTelemetry/README.md +++ b/packages/OpenTelemetry/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## OpenTelemetry integration -Distributed tracing for every message in your Ecotone application. Commands, events, queries, async handlers, saga steps, and projections are traced automatically — so the full causal chain across sync and async flows is visible in any OTLP-compatible backend (Jaeger, Tempo, Grafana, Honeycomb, Datadog, New Relic, and others). +Distributed tracing for every message in your Ecotone application. Commands, events, queries, [async handlers](https://ecotone.tech/asynchronous-communication), [saga steps](https://ecotone.tech/durable-workflows), and [projections](https://ecotone.tech/event-sourcing) are traced automatically — so the full causal chain across sync and async flows is visible in any OTLP-compatible backend (Jaeger, Tempo, Grafana, Honeycomb, Datadog, New Relic, and others). See [tracing configuration](https://docs.ecotone.tech/modules/opentelemetry-tracing-and-metrics) for the full setup. - **Automatic span creation** per handler invocation - **Trace context propagation** across async channels — traces don't break when a message crosses a queue diff --git a/packages/OpenTelemetry/composer.json b/packages/OpenTelemetry/composer.json index d0c8686d2..27dcc7694 100644 --- a/packages/OpenTelemetry/composer.json +++ b/packages/OpenTelemetry/composer.json @@ -17,8 +17,12 @@ ], "keywords": [ "ecotone", - "Open telemetry", - "tracing" + "opentelemetry", + "otel", + "tracing", + "distributed-tracing", + "observability", + "otlp" ], "description": "OpenTelemetry distributed tracing for Ecotone \u2014 automatic spans and trace context propagation across sync and async flows.", "repositories": [ diff --git a/packages/PdoEventSourcing/README.md b/packages/PdoEventSourcing/README.md index d4ad01d7d..89b52aa5e 100644 --- a/packages/PdoEventSourcing/README.md +++ b/packages/PdoEventSourcing/README.md @@ -15,11 +15,12 @@ To contribute make use of [Ecotone-Dev repository](https://github.com/ecotonefra From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distributed messaging at scale — one package, same codebase, no forced migrations between growth stages. Declarative PHP 8 attributes on the classes you already have. -## Event Sourcing (PDO-backed Event Store) +## [Event Sourcing](https://ecotone.tech/event-sourcing) (PDO-backed Event Store) Full Event Sourcing support for Ecotone, backed by your relational database via PDO. Event-sourced aggregates, projections, upcasting, and replay — all driven by attributes on your existing classes. - **Event-sourced aggregates** via `#[EventSourcingAggregate]` — one attribute flips state-stored to event-sourced +- **Event-sourced sagas** via `#[EventSourcingSaga]` — [durable workflows](https://ecotone.tech/durable-workflows) where every state transition is a replayable event in your database - **Projections** via `#[Projection]` — catch-up, reset, partition, and streaming variants - **Event versioning and upcasting** — evolve your event schema without rewriting history - **Streaming Projections** — process events in real-time with Message Broker transport @@ -61,4 +62,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor: ## Tags -PHP, Event Sourcing, Event Store, Projections, DCB, CQRS, DDD, PostgreSQL, MySQL, Ecotone +PHP, Event Sourcing, Event Store, Projections, Event-Sourced Sagas, Durable Workflows, CQRS, DDD, PostgreSQL, MySQL, Ecotone diff --git a/packages/PdoEventSourcing/composer.json b/packages/PdoEventSourcing/composer.json index 23359a823..7860a33fc 100644 --- a/packages/PdoEventSourcing/composer.json +++ b/packages/PdoEventSourcing/composer.json @@ -16,10 +16,19 @@ } ], "keywords": [ - "dbal", - "ecotone" + "ecotone", + "event-sourcing", + "event-store", + "event-sourced-saga", + "durable-workflows", + "projections", + "cqrs", + "ddd", + "postgresql", + "mysql", + "pdo" ], - "description": "PDO-backed Event Store for Ecotone \u2014 event-sourced aggregates, projections, upcasting, and streaming projections (Kafka, RabbitMQ).", + "description": "PDO-backed Event Store for Ecotone \u2014 event-sourced aggregates, event-sourced sagas (durable workflows), projections, upcasting, and streaming projections (Kafka, RabbitMQ) on PostgreSQL or MySQL.", "repositories": [ { "type": "path", diff --git a/packages/Redis/README.md b/packages/Redis/README.md index 7308e91d9..2d588d58a 100644 --- a/packages/Redis/README.md +++ b/packages/Redis/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Redis transport -Route `#[Asynchronous]` handlers to Redis-backed channels. Low-latency, low-setup asynchronous messaging that plugs into the same retry, outbox, and dead letter pipeline as every other Ecotone transport — so switching to RabbitMQ, Kafka, or DBAL later doesn't change your handler code or your tests. +Route `#[Asynchronous]` handlers to Redis-backed channels. Low-latency, low-setup [asynchronous messaging](https://ecotone.tech/asynchronous-communication) that plugs into the same [retry, outbox, and dead letter pipeline](https://docs.ecotone.tech/solutions/unreliable-async-processing) as every other Ecotone transport — so switching to RabbitMQ, Kafka, or DBAL later doesn't change your handler code or your tests. Carries [durable workflow](https://ecotone.tech/durable-workflows) execution on the same broker. Ideal for teams that already run Redis and want asynchronous processing without standing up a dedicated message broker. diff --git a/packages/Redis/composer.json b/packages/Redis/composer.json index 8d462ef09..fd7625b68 100644 --- a/packages/Redis/composer.json +++ b/packages/Redis/composer.json @@ -22,7 +22,11 @@ ], "keywords": [ "ecotone", - "redis" + "redis", + "message-broker", + "async-messaging", + "outbox", + "durable-workflows" ], "description": "Redis transport for Ecotone asynchronous messaging.", "repositories": [ diff --git a/packages/Sqs/README.md b/packages/Sqs/README.md index f21621258..3df6de6bd 100644 --- a/packages/Sqs/README.md +++ b/packages/Sqs/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## AWS SQS transport -Route `#[Asynchronous]` handlers to AWS SQS queues. Managed messaging for teams already on AWS, with automatic retry, outbox, and dead letter handling — all through the same Ecotone pipeline that works with RabbitMQ, Kafka, Redis, and DBAL, so switching transports never changes your handler or test code. +Route `#[Asynchronous]` handlers to AWS SQS queues. Managed messaging for teams already on AWS, with automatic [retry, outbox, and dead letter handling](https://docs.ecotone.tech/solutions/unreliable-async-processing) — all through the same Ecotone pipeline that works with RabbitMQ, Kafka, Redis, and DBAL, so switching transports never changes your handler or test code. Carries [asynchronous communication](https://ecotone.tech/asynchronous-communication) and [durable workflow](https://ecotone.tech/durable-workflows) execution on the same broker. - **Standard and FIFO queues** supported - **IAM-based authentication** via the AWS SDK diff --git a/packages/Sqs/composer.json b/packages/Sqs/composer.json index 5b3b7f296..a3a2a1d4b 100644 --- a/packages/Sqs/composer.json +++ b/packages/Sqs/composer.json @@ -17,7 +17,14 @@ ], "keywords": [ "ecotone", - "Sqs" + "sqs", + "aws-sqs", + "amazon-sqs", + "message-broker", + "async-messaging", + "fifo", + "outbox", + "durable-workflows" ], "description": "AWS SQS transport for Ecotone asynchronous messaging.", "repositories": [ diff --git a/packages/Symfony/README.md b/packages/Symfony/README.md index e38ad91e6..ae27e7d51 100644 --- a/packages/Symfony/README.md +++ b/packages/Symfony/README.md @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr ## Ecotone for Symfony -Symfony Messenger gives you a bus. Ecotone gives you the full architecture on top — Event Sourcing, Sagas, Workflows, Outbox, and per-handler failure isolation, so one failing listener never blocks another. +Symfony Messenger gives you a bus. Ecotone gives you the full architecture on top — [Event Sourcing](https://ecotone.tech/event-sourcing), [Sagas and durable workflows](https://ecotone.tech/durable-workflows), [Outbox](https://docs.ecotone.tech/solutions/unreliable-async-processing), and per-handler failure isolation, so one failing listener never blocks another. - **Symfony Messenger compatible** — your existing transports keep working - **Bundle auto-configuration** — zero config to start @@ -64,4 +64,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor: ## Tags -PHP, Symfony, Symfony Bundle, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Service Bus, Messenger +PHP, Symfony, Symfony Bundle, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Workflows, Outbox, Service Bus, Messenger diff --git a/packages/Symfony/composer.json b/packages/Symfony/composer.json index a3335f358..a0ae9ab97 100644 --- a/packages/Symfony/composer.json +++ b/packages/Symfony/composer.json @@ -17,15 +17,20 @@ ], "keywords": [ "symfony", + "symfony-bundle", + "symfony-messenger", "ecotone", "ddd", + "cqrs", + "event-sourcing", + "sagas", + "durable-workflows", + "workflow", + "outbox", "messaging", - "message", - "enterprise integration patterns", - "eip", - "distributed architecture" + "eip" ], - "description": "Ecotone for Symfony \u2014 CQRS, Event Sourcing, Sagas, and Workflows on top of Symfony Messenger, via PHP attributes.", + "description": "Ecotone for Symfony \u2014 CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Symfony Messenger, via PHP attributes.", "repositories": [ { "type": "path", diff --git a/shared-channels.md b/shared-channels.md deleted file mode 100644 index 755395923..000000000 --- a/shared-channels.md +++ /dev/null @@ -1,81 +0,0 @@ -Summary: Shared Channels with Consumer Groups - Requirements, Problems, and Solutions - -Use Cases for Shared Channels - -Use Case 1: Distributed Bus with Service Map -Goal: Publish events to shared channel, multiple applications consume with separate consumer groups. - -Example: - -```php -// Publisher (User Service) -$distributedBus->publishEvent('UserRegistered', $event); - -// Consumer (Ticket Service) -#[EventHandler(listenTo: 'UserRegistered')] -public function createTicket(UserRegistered $event) { } - -// Consumer (Order Service) -#[EventHandler(listenTo: 'UserRegistered')] -public function createOrder(UserRegistered $event) { } -``` -Configuration: -```php -// User Service (Publisher) -DistributedServiceMap::initialize() - ->withServiceMapping( - serviceName: 'ticket-service', - channelName: 'distributed_events' - ) - ->withServiceMapping( - serviceName: 'order-service', - channelName: 'distributed_events' - ); - -// Ticket Service defines channel with its own consumer group -AmqpStreamChannelBuilder::createShared( - channelName: 'distributed_events', - queueName: 'events_stream', - defaultEndpointId: 'ticket-service' -); - -// Order Service defines channel with its own consumer group -AmqpStreamChannelBuilder::createShared( - channelName: 'distributed_events', - queueName: 'events_stream', - defaultEndpointId: 'order-service' -); -``` - - -Requirements: - -✅ Publisher defines shared channel -✅ Each application uses separate endpoint ID for tracking (separate message group) -✅ Multiple applications consume from one channel -✅ Each application executes all its event handlers together -✅ Routing slip should point to Event Bus, not specific handlers -Consumer Group ID: {serviceName}:{queueName} (e.g., ticket-service:events_stream, order-service:events_stream) - -Use Case 2: Projections (Multiple Consumer Groups per Application) -Goal: Each projection runs as separate consumer group, allowing independent progress tracking. - -Example: - -```php -#[Projection(name: 'user_statistics', fromStreams: ['user_events'])] -#[Asynchronous('projection_channel')] -class UserStatisticsProjection { } - -#[Projection(name: 'user_audit', fromStreams: ['user_events'])] -#[Asynchronous('projection_channel')] -class UserAuditProjection { } -``` - -Requirements: - -✅ Each projection = separate consumer group (separate endpoint ID) -✅ Multiple message groups (endpoint IDs) on same application level -✅ Each projection tracks its own position independently -✅ Channel defined with default endpoint ID, but overridden per projection -Consumer Group ID: {projectionName}:{queueName} (e.g., user_statistics:events_stream, user_audit:events_stream) \ No newline at end of file