{"version":1,"pages":[{"id":"-LmAUyAjhFQ1GrOTgaEL","title":"About","pathname":"/","siteSpaceId":"sitesp_ySrl5","description":"Ecotone — the PHP architecture layer that grows with your system, without rewrites"},{"id":"a2Mt33RxLrWpF0aU0lIF","title":"Why Ecotone?","pathname":"/why-ecotone","siteSpaceId":"sitesp_ySrl5","description":"Why Ecotone — the PHP architecture layer that grows with your system, without rewrites"},{"id":"f4oC64sotCNlnd6ajBcv","title":"Composing Building Blocks","pathname":"/composing-building-blocks","siteSpaceId":"sitesp_ySrl5","description":"How Ecotone's building blocks compose without orchestration code — one story, nine common composition problems"},{"id":"OAZh4FxdYOmm2tVgU9FJ","title":"Solutions","pathname":"/solutions","siteSpaceId":"sitesp_ySrl5","description":"Common challenges Ecotone solves for Laravel and Symfony developers"},{"id":"VUvk0SubxrehOxgPVplR","title":"Scattered Application Logic","pathname":"/solutions/scattered-application-logic","siteSpaceId":"sitesp_ySrl5","description":"How to organize business logic with CQRS in Laravel and Symfony using Ecotone","breadcrumbs":[{"label":"Solutions"}]},{"id":"UxT0gcpaZoAE559NWNNI","title":"Unreliable Async Processing","pathname":"/solutions/unreliable-async-processing","siteSpaceId":"sitesp_ySrl5","description":"How to build reliable async processing in Laravel and Symfony with Ecotone","breadcrumbs":[{"label":"Solutions"}]},{"id":"Qd8QYdpQioIXyZOevmLm","title":"Complex Business Processes","pathname":"/solutions/complex-business-processes","siteSpaceId":"sitesp_ySrl5","description":"How to manage complex multi-step business workflows in PHP with Ecotone","breadcrumbs":[{"label":"Solutions"}]},{"id":"OpjIvs24D7HsDayvVclF","title":"Durable Execution","pathname":"/solutions/durable-execution","siteSpaceId":"sitesp_ySrl5","description":"Durable execution in PHP — sagas, workflows, outbox, and retries on the database and broker you already run, with no separate cluster","breadcrumbs":[{"label":"Solutions"}]},{"id":"aaOB6y0hE9Xo1yL6OqBF","title":"Audit Trail & State Rebuild","pathname":"/solutions/audit-trail-and-state-rebuild","siteSpaceId":"sitesp_ySrl5","description":"How to implement Event Sourcing for audit trails and state rebuilds in PHP","breadcrumbs":[{"label":"Solutions"}]},{"id":"TyE199cQ4s9M12Gb7Nof","title":"Microservice Communication","pathname":"/solutions/microservice-communication","siteSpaceId":"sitesp_ySrl5","description":"How to build reliable microservice communication in PHP with Ecotone Distributed Bus","breadcrumbs":[{"label":"Solutions"}]},{"id":"HYf5cx4DhUtYhVzSrnmz","title":"PHP for Enterprise Architecture","pathname":"/solutions/php-for-enterprise-architecture","siteSpaceId":"sitesp_ySrl5","description":"Enterprise architecture patterns in PHP - comparing Ecotone to Spring, Axon, NServiceBus","breadcrumbs":[{"label":"Solutions"}]},{"id":"-MSWNjunWlm-wNnXL0Jz","title":"Installation","pathname":"/install-php-service-bus","siteSpaceId":"sitesp_ySrl5","description":"Installing Ecotone for Symfony, Laravel or Stand Alone"},{"id":"-MV5n4JqUQKliCqs7P3a","title":"How to use","pathname":"/quick-start-php-ddd-cqrs-event-sourcing","siteSpaceId":"sitesp_ySrl5","description":"Domain Driven Design Command Query Responsibility Segregation PHP"},{"id":"-MV5rtdzyuQMHgPEPUtS","title":"CQRS PHP","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/php-cqrs","siteSpaceId":"sitesp_ySrl5","description":"Command Query Responsibility Segregation PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"-MVArTyR47nS9yw4GsDF","title":"Event Handling PHP","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/php-event-handling","siteSpaceId":"sitesp_ySrl5","description":"Event Handlers PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"DkZEmFm5Uypl6Wfz5mi5","title":"Aggregates & Sagas","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/aggregates-and-sagas","siteSpaceId":"sitesp_ySrl5","description":"Quick start with Aggregates and Sagas in Ecotone PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"2ws96ThvSpe9WB5r9Oek","title":"Scheduling in PHP","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/scheduling-in-php","siteSpaceId":"sitesp_ySrl5","description":"Quick start with scheduled tasks and periodic processing in PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"-MhOeMXu1rW7uL-miYX4","title":"Asynchronous PHP","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/asynchronous-php","siteSpaceId":"sitesp_ySrl5","description":"Running the code asynchronously","breadcrumbs":[{"label":"How to use"}]},{"id":"DIJm6Rl9sGHxxoxWhqHU","title":"Event Sourcing PHP","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/event-sourcing-php","siteSpaceId":"sitesp_ySrl5","description":"Quick start with Event Sourcing in Ecotone PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"76fVaHTOMJQH380I3EIW","title":"Microservices PHP","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/microservices-php","siteSpaceId":"sitesp_ySrl5","description":"Microservices, Message-Driven, Event-Driven Architecture in PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"b7is3fxh8gdHHkyBFoXb","title":"Resiliency and Error Handling","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/resiliency-and-error-handling","siteSpaceId":"sitesp_ySrl5","description":"Outbox pattern implementation in PHP","breadcrumbs":[{"label":"How to use"}]},{"id":"2xYNIA60NZxrCOlMu96L","title":"Laravel Demos","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/laravel-ddd-cqrs-demo-application","siteSpaceId":"sitesp_ySrl5","description":"Laravel demo applications with DDD, CQRS, and Event Sourcing","breadcrumbs":[{"label":"How to use"}]},{"id":"QeRkNxfShOcTFjnlmNGP","title":"Symfony Demos","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/symfony-ddd-cqrs-demo-application","siteSpaceId":"sitesp_ySrl5","description":"Symfony demo applications with DDD, CQRS, and Event Sourcing","breadcrumbs":[{"label":"How to use"}]},{"id":"T8di9JeATiXftYkDPbSe","title":"Doctrine ORM","pathname":"/quick-start-php-ddd-cqrs-event-sourcing/symfony-ddd-cqrs-demo-application/doctrine-orm","siteSpaceId":"sitesp_ySrl5","description":"Symfony demo with Doctrine ORM and Ecotone","breadcrumbs":[{"label":"How to use"},{"label":"Symfony Demos"}]},{"id":"-Lt_uuBrCe8fuCD8s30u","title":"Tutorial","pathname":"/tutorial-php-ddd-cqrs-event-sourcing","siteSpaceId":"sitesp_ySrl5","description":"Ecotone PHP Framework"},{"id":"-LwOW0-lDh8zQ8s0U9Oi","title":"Before we start tutorial","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/before-we-start-tutorial","siteSpaceId":"sitesp_ySrl5","description":"Prerequisites and setup before starting the Ecotone tutorial","breadcrumbs":[{"label":"Tutorial"}]},{"id":"-LwJdfbjwW5TzsHUY492","title":"Lesson 1: Messaging Concepts","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/php-messaging-architecture","siteSpaceId":"sitesp_ySrl5","description":"PHP Messages","breadcrumbs":[{"label":"Tutorial"}]},{"id":"-LxBH5afqjMs-o8Te7M8","title":"Lesson 2: Tactical DDD","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/php-domain-driven-design","siteSpaceId":"sitesp_ySrl5","description":"DDD PHP","breadcrumbs":[{"label":"Tutorial"}]},{"id":"-LxCmMuxvJkXCgu-MqBc","title":"Lesson 3: Converters","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/php-serialization-deserialization","siteSpaceId":"sitesp_ySrl5","description":"PHP Conversion","breadcrumbs":[{"label":"Tutorial"}]},{"id":"-LzD1w2VwtSDBLdEp0cl","title":"Lesson 4: Metadata and Method Invocation","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/php-metadata-method-invocation","siteSpaceId":"sitesp_ySrl5","description":"PHP Metadata and Method Invocation","breadcrumbs":[{"label":"Tutorial"}]},{"id":"-LzJSj25N1hA3o37VAJ0","title":"Lesson 5: Interceptors","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/php-interceptors-middlewares","siteSpaceId":"sitesp_ySrl5","description":"PHP Middlewares Interceptors","breadcrumbs":[{"label":"Tutorial"}]},{"id":"-LzY1ydkf6YyXXgS7b5y","title":"Lesson 6: Asynchronous Handling","pathname":"/tutorial-php-ddd-cqrs-event-sourcing/php-asynchronous-processing","siteSpaceId":"sitesp_ySrl5","description":"Asynchronous PHP Workers","breadcrumbs":[{"label":"Tutorial"}]},{"id":"HaBGukJ4YmjbLg7Af5rn","title":"Enterprise","pathname":"/enterprise","siteSpaceId":"sitesp_ySrl5","description":"Ecotone Enterprise features for scaling multi-tenant and multi-service PHP systems"},{"id":"-LmQZi44HDTzIwS-aFYk","title":"Introduction","pathname":"/modelling/message-driven-php-introduction","siteSpaceId":"sitesp_ySrl5","description":"Message Driven System with Domain Driven Design principles in PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"-Lt_ya8hZXSiijQll5V9","title":"Message Bus and CQRS","pathname":"/modelling/command-handling","siteSpaceId":"sitesp_ySrl5","description":"PHP Message Bus, CQRS, Command Event Query Handlers","breadcrumbs":[{"label":"Modelling"}]},{"id":"-Lt_zw1NKG_dFYygDHqA","title":"CQRS Introduction - Commands","pathname":"/modelling/command-handling/external-command-handlers","siteSpaceId":"sitesp_ySrl5","description":"Commands CQRS PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"}]},{"id":"UdnVNqoCLPrDi5pMSPsI","title":"Query Handling","pathname":"/modelling/command-handling/external-command-handlers/query-handling","siteSpaceId":"sitesp_ySrl5","description":"Query CQRS PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"CQRS Introduction - Commands"}]},{"id":"Y0NnUGuXaDxAKudOrCPA","title":"Event Handling","pathname":"/modelling/command-handling/external-command-handlers/event-handling","siteSpaceId":"sitesp_ySrl5","description":"Event CQRS PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"CQRS Introduction - Commands"}]},{"id":"-Ltf5vbiWcudp56Lyy-d","title":"Aggregate Introduction","pathname":"/modelling/command-handling/state-stored-aggregate","siteSpaceId":"sitesp_ySrl5","description":"DDD Aggregates PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"}]},{"id":"pU6d69t1tVai1mgtbUtI","title":"Aggregate Command Handlers","pathname":"/modelling/command-handling/state-stored-aggregate/aggregate-command-handlers","siteSpaceId":"sitesp_ySrl5","description":"DDD PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Aggregate Introduction"}]},{"id":"Z4ujdB9SKRdSRUfoBk9A","title":"Aggregate Query Handlers","pathname":"/modelling/command-handling/state-stored-aggregate/aggregate-query-handlers","siteSpaceId":"sitesp_ySrl5","description":"DDD PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Aggregate Introduction"}]},{"id":"p9p6WhcRBeGz7RmjqtMl","title":"Aggregate Event Handlers","pathname":"/modelling/command-handling/state-stored-aggregate/aggregate-event-handlers","siteSpaceId":"sitesp_ySrl5","description":"DDD PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Aggregate Introduction"}]},{"id":"OYaSmnzvDPKmejJwAOop","title":"Advanced Aggregate creation","pathname":"/modelling/command-handling/state-stored-aggregate/advanced-aggregate-creation","siteSpaceId":"sitesp_ySrl5","description":"DDD PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Aggregate Introduction"}]},{"id":"-Lu9GB_eK9VnA80Lm7hp","title":"Repositories Introduction","pathname":"/modelling/command-handling/repository","siteSpaceId":"sitesp_ySrl5","description":"Repository PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"}]},{"id":"zD6RC1Y3GqFS4caQgQFu","title":"Configure Repository","pathname":"/modelling/command-handling/repository/configure-repository","siteSpaceId":"sitesp_ySrl5","description":"Configuring custom Aggregate repositories in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Repositories Introduction"}]},{"id":"BemuI6aqqmllCIhF8lFC","title":"Fetching/Storing Aggregates","pathname":"/modelling/command-handling/repository/repository","siteSpaceId":"sitesp_ySrl5","description":"Fetching and storing Aggregates with repositories in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Repositories Introduction"}]},{"id":"ITsQAUExMgtTx7VuccYq","title":"Inbuilt Repositories","pathname":"/modelling/command-handling/repository/inbuilt-repositories","siteSpaceId":"sitesp_ySrl5","description":"Built-in Aggregate repositories for Doctrine ORM, Eloquent, and DBAL","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Repositories Introduction"}]},{"id":"t98r5TLcpQPg68KqCIsi","title":"Business Interface","pathname":"/modelling/command-handling/business-interface","siteSpaceId":"sitesp_ySrl5","description":"Business Interfaces for type-safe messaging in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"}]},{"id":"pQmOc5Wucm8dkY9ZQaej","title":"Introduction","pathname":"/modelling/command-handling/business-interface/introduction","siteSpaceId":"sitesp_ySrl5","description":"Introduction to Business Interfaces in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Business Interface"}]},{"id":"1ZR8RZrEnX447XWYz39m","title":"Database Business Interface","pathname":"/modelling/command-handling/business-interface/working-with-database","siteSpaceId":"sitesp_ySrl5","description":"Database Business Interface for type-safe database access in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Business Interface"}]},{"id":"8CcpN6y8OF6oN7Blju7Y","title":"Converting Parameters","pathname":"/modelling/command-handling/business-interface/working-with-database/converting-parameters","siteSpaceId":"sitesp_ySrl5","description":"Converting parameters in Database Business Interface queries","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Business Interface"},{"label":"Database Business Interface"}]},{"id":"AWANL0vlPceGv3XTs9fu","title":"Converting Results","pathname":"/modelling/command-handling/business-interface/working-with-database/converting-results","siteSpaceId":"sitesp_ySrl5","description":"Converting query results in Database Business Interface","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"},{"label":"Business Interface"},{"label":"Database Business Interface"}]},{"id":"-M3CIac4CVMykZEZCN2H","title":"Saga Introduction","pathname":"/modelling/command-handling/saga","siteSpaceId":"sitesp_ySrl5","description":"Process Manager Saga PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"}]},{"id":"V5UqJvGbuwEl1GSNLk4v","title":"Identifier Mapping","pathname":"/modelling/command-handling/identifier-mapping","siteSpaceId":"sitesp_ySrl5","description":"Mapping identifiers for Aggregate and Saga routing in Ecotone","breadcrumbs":[{"label":"Modelling"},{"label":"Message Bus and CQRS"}]},{"id":"X5kFpeV2NiYKpIW1h3fF","title":"Extending Messaging (Middlewares)","pathname":"/modelling/extending-messaging-middlewares","siteSpaceId":"sitesp_ySrl5","description":"Extending messaging with Interceptors and Middlewares in Ecotone PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"mFcdNxpqpBXoAWPu1l56","title":"Message Headers","pathname":"/modelling/extending-messaging-middlewares/message-headers","siteSpaceId":"sitesp_ySrl5","description":"Working with Message Headers and metadata in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Extending Messaging (Middlewares)"}]},{"id":"-Lwi7i-PxTnIw8Bhxk5z","title":"Interceptors (Middlewares)","pathname":"/modelling/extending-messaging-middlewares/interceptors","siteSpaceId":"sitesp_ySrl5","description":"PHP Interceptors Middlewares","breadcrumbs":[{"label":"Modelling"},{"label":"Extending Messaging (Middlewares)"}]},{"id":"MA9k8wogf2eeaN3C1qyK","title":"Additional Scenarios","pathname":"/modelling/extending-messaging-middlewares/interceptors/additional-scenarios","siteSpaceId":"sitesp_ySrl5","description":"Advanced Interceptor scenarios and configurations in Ecotone","breadcrumbs":[{"label":"Modelling"},{"label":"Extending Messaging (Middlewares)"},{"label":"Interceptors (Middlewares)"}]},{"id":"vnb2YOougQgkQteXFjNY","title":"Intercepting Asynchronous Endpoints","pathname":"/modelling/extending-messaging-middlewares/intercepting-asynchronous-endpoints","siteSpaceId":"sitesp_ySrl5","description":"Intercepting asynchronous message endpoints in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Extending Messaging (Middlewares)"}]},{"id":"alxWoMdekQ6i8986Ni6J","title":"Extending Message Buses (Gateways)","pathname":"/modelling/extending-messaging-middlewares/extending-message-buses-gateways","siteSpaceId":"sitesp_ySrl5","description":"Extending Command, Event, and Query Buses with custom Gateways","breadcrumbs":[{"label":"Modelling"},{"label":"Extending Messaging (Middlewares)"}]},{"id":"-MVDLgIBFMr82IZk6FDd","title":"Event Sourcing","pathname":"/modelling/event-sourcing","siteSpaceId":"sitesp_ySrl5","description":"Event Sourcing PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"68QmBE36bloa9V2AHpfF","title":"Installation","pathname":"/modelling/event-sourcing/installation","siteSpaceId":"sitesp_ySrl5","description":"Installing Event Sourcing support in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"}]},{"id":"tJcCqU651AXutnQFWFVV","title":"Event Sourcing Introduction","pathname":"/modelling/event-sourcing/event-sourcing-introduction","siteSpaceId":"sitesp_ySrl5","description":"Using Event Sourcing in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"}]},{"id":"xz0rgJ4ZNG4YwG7BO5nb","title":"Working with Event Streams","pathname":"/modelling/event-sourcing/event-sourcing-introduction/working-with-event-streams","siteSpaceId":"sitesp_ySrl5","description":"Working with Event Streams in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"}]},{"id":"gkYIGO6zzfHzEqFdJ9FF","title":"Event Sourcing Aggregates","pathname":"/modelling/event-sourcing/event-sourcing-introduction/event-sourcing-aggregates","siteSpaceId":"sitesp_ySrl5","description":"Event Sourcing Aggregates in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"}]},{"id":"aLJpFfeCOUvqTKvGRowA","title":"Working with Aggregates","pathname":"/modelling/event-sourcing/event-sourcing-introduction/event-sourcing-aggregates/working-with-aggregates","siteSpaceId":"sitesp_ySrl5","description":"Working with Event Sourcing Aggregates in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Sourcing Aggregates"}]},{"id":"ep9rGfhWNPswEdNTrwCR","title":"Applying Events","pathname":"/modelling/event-sourcing/event-sourcing-introduction/event-sourcing-aggregates/applying-events","siteSpaceId":"sitesp_ySrl5","description":"Applying events to rebuild Event Sourcing Aggregate state in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Sourcing Aggregates"}]},{"id":"ijCIUGxrpluFkkol4UTO","title":"Different ways to Record Events","pathname":"/modelling/event-sourcing/event-sourcing-introduction/event-sourcing-aggregates/different-ways-to-record-events","siteSpaceId":"sitesp_ySrl5","description":"Different ways to record events in Event Sourcing Aggregates","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Sourcing Aggregates"}]},{"id":"jXUy4WLisUqLan5niidk","title":"Working with Metadata","pathname":"/modelling/event-sourcing/event-sourcing-introduction/working-with-metadata","siteSpaceId":"sitesp_ySrl5","description":"Working with event metadata in Event Sourcing","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"}]},{"id":"Pv6sRgqBAkUc1Oniav5O","title":"Event versioning","pathname":"/modelling/event-sourcing/event-sourcing-introduction/event-versioning","siteSpaceId":"sitesp_ySrl5","description":"Event versioning and upcasting for Event Sourcing in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"}]},{"id":"tx4yiydCuZTgcEUNjcPv","title":"Event Stream Persistence","pathname":"/modelling/event-sourcing/event-sourcing-introduction/persistence-strategy","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Persistence Strategy","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"}]},{"id":"bQjhJA1srvfbksNhXzKm","title":"Event Sourcing Repository","pathname":"/modelling/event-sourcing/event-sourcing-introduction/persistence-strategy/event-sourcing-repository","siteSpaceId":"sitesp_ySrl5","description":"Configuring Event Sourcing repositories in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Stream Persistence"}]},{"id":"mj2uWvqhmLMTmbAWdtAH","title":"Making Stream immune to changes","pathname":"/modelling/event-sourcing/event-sourcing-introduction/persistence-strategy/making-stream-immune-to-changes","siteSpaceId":"sitesp_ySrl5","description":"Making event streams immune to class and namespace changes","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Stream Persistence"}]},{"id":"WU1Ga8Qf49eemoZ5tFFC","title":"Snapshoting","pathname":"/modelling/event-sourcing/event-sourcing-introduction/persistence-strategy/snapshoting","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Snapshoting","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Stream Persistence"}]},{"id":"jbxT1HoQUhNgU8J6i1L6","title":"Persistence Strategies","pathname":"/modelling/event-sourcing/event-sourcing-introduction/persistence-strategy/persistence-strategies","siteSpaceId":"sitesp_ySrl5","description":"Event stream persistence strategies in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Stream Persistence"}]},{"id":"8MSSHXx2eRxXEY5LgNiZ","title":"Event Serialization and PII Data (GDPR)","pathname":"/modelling/event-sourcing/event-sourcing-introduction/persistence-strategy/event-serialization-and-pii-data-gdpr","siteSpaceId":"sitesp_ySrl5","description":"Event serialization and GDPR-compliant PII data handling","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Event Sourcing Introduction"},{"label":"Event Stream Persistence"}]},{"id":"UPhUDoAyrVfRJHUqBJa9","title":"Projection Introduction","pathname":"/modelling/event-sourcing/setting-up-projections","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projections","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"}]},{"id":"QCVWBGSD7Gov1QRh0leb","title":"Event Streams and Handlers","pathname":"/modelling/event-sourcing/setting-up-projections/event-streams-and-handlers","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Streams and Event Handlers","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"C9F5USk30fZF3njid1t0","title":"Projections with Document Store","pathname":"/modelling/event-sourcing/setting-up-projections/document-store-projection","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projections with Document Store","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"b7WB6nCRLKKb6BYo3pdv","title":"Execution Modes","pathname":"/modelling/event-sourcing/setting-up-projections/execution-modes","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Execution Modes","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"qV8oglnbEjH9pri7oFDn","title":"Lifecycle Management","pathname":"/modelling/event-sourcing/setting-up-projections/lifecycle-management","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Lifecycle and CLI","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"9VgjcgNrS8NB20CKVNho","title":"Projections with State","pathname":"/modelling/event-sourcing/setting-up-projections/projections-with-state","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Stateful Projections","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"5orTIv4OTQZOsqz9KKv9","title":"Emitting Events","pathname":"/modelling/event-sourcing/setting-up-projections/emitting-events","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Event Emission","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"AuCbVaBE4XG6sfJxEyEg","title":"Backfill and Rebuild","pathname":"/modelling/event-sourcing/setting-up-projections/backfill-and-rebuild","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Backfill and Rebuild","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"KB55Bh6jF4TyBhreYHVP","title":"Failure Handling","pathname":"/modelling/event-sourcing/setting-up-projections/failure-handling","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Failure Handling and Recovery","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"o1Vhf8AMmgrGKs3O4nNP","title":"Scaling and Advanced","pathname":"/modelling/event-sourcing/setting-up-projections/scaling-and-advanced","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Scaling","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"1gDePaFRZX2nXEo2DRoU","title":"Gap Detection and Consistency","pathname":"/modelling/event-sourcing/setting-up-projections/gap-detection-and-consistency","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Gap Detection","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"7Io0lz0nvAKAQTfeWljv","title":"Blue-Green Deployments","pathname":"/modelling/event-sourcing/setting-up-projections/blue-green-deployments","siteSpaceId":"sitesp_ySrl5","description":"PHP Event Sourcing Projection Blue-Green Deployments","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"vPqFm5FJhvp0obNvsfTt","title":"Upgrading from V1 to V2","pathname":"/modelling/event-sourcing/setting-up-projections/upgrading-from-v1","siteSpaceId":"sitesp_ySrl5","description":"Upgrading from Projection V1 to ProjectionV2","breadcrumbs":[{"label":"Modelling"},{"label":"Event Sourcing"},{"label":"Projection Introduction"}]},{"id":"FS7uNFYYXw46Ij6UTKNx","title":"Recovering, Tracing and Monitoring","pathname":"/modelling/recovering-tracing-and-monitoring","siteSpaceId":"sitesp_ySrl5","description":"Recovering, tracing, and monitoring message-driven applications","breadcrumbs":[{"label":"Modelling"}]},{"id":"EfF9thHbIFiaUeRFECxT","title":"Resiliency","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency","siteSpaceId":"sitesp_ySrl5","description":"Production resilience with retries, dead letter, outbox, and deduplication","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"}]},{"id":"W0EQ8rag1U1v275EiAGF","title":"Retries","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/retries","siteSpaceId":"sitesp_ySrl5","description":"Configuring automatic message retry strategies in Ecotone PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"kEAOgSeRZf2fS0YVZjgq","title":"Error Channel","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/error-channel-and-dead-letter","siteSpaceId":"sitesp_ySrl5","description":"Error channels and dead letter queues for failed message handling","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"2PVwPHuKN99uc6lW2YS5","title":"Dbal Dead Letter","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/error-channel-and-dead-letter/dbal-dead-letter","siteSpaceId":"sitesp_ySrl5","description":"DBAL-based dead letter queue for storing and replaying failed messages","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"},{"label":"Error Channel"}]},{"id":"A0krcOxGvYfIyNUy3m1R","title":"Final Failure Strategy","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/final-failure-strategy","siteSpaceId":"sitesp_ySrl5","description":"Final failure strategy when all message retries are exhausted","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"D7fI72Kl5YKTw6Fxeqpf","title":"Idempotency (Deduplication)","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/idempotent-consumer-deduplication","siteSpaceId":"sitesp_ySrl5","description":"Idempotent consumer pattern for message deduplication in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"p1LLGF2EsxM7PtFFtWrL","title":"Resilient Sending","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/resilient-sending","siteSpaceId":"sitesp_ySrl5","description":"Resilient sending for guaranteed message delivery to async channels","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"rOCHI7QIJOBB2jbWhNT7","title":"Outbox Pattern","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/outbox-pattern","siteSpaceId":"sitesp_ySrl5","description":"Outbox pattern for atomic message publishing with database transactions","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"uywVYuITvz7MKduqF3WB","title":"Concurrency Handling","pathname":"/modelling/recovering-tracing-and-monitoring/resiliency/concurrency-handling","siteSpaceId":"sitesp_ySrl5","description":"Handling concurrency with optimistic and pessimistic locking","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"},{"label":"Resiliency"}]},{"id":"Aix5c5faxPo9ySCEoHvQ","title":"Message Handling Isolation","pathname":"/modelling/recovering-tracing-and-monitoring/message-handling-isolation","siteSpaceId":"sitesp_ySrl5","description":"Message handling isolation for safe retries without side effects","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"}]},{"id":"PylFfmhalMmlkWPjD6Am","title":"Ecotone Pulse (Service Dashboard)","pathname":"/modelling/recovering-tracing-and-monitoring/ecotone-pulse-service-dashboard","siteSpaceId":"sitesp_ySrl5","description":"Ecotone Pulse service dashboard for monitoring message consumers","breadcrumbs":[{"label":"Modelling"},{"label":"Recovering, Tracing and Monitoring"}]},{"id":"-MV1yBSCuFjhGup3G9hb","title":"Asynchronous Handling and Scheduling","pathname":"/modelling/asynchronous-handling","siteSpaceId":"sitesp_ySrl5","description":"Asynchronous PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"Sg5toYJ9X9EeB3jWTxnd","title":"Asynchronous Message Handlers","pathname":"/modelling/asynchronous-handling/asynchronous-message-handlers","siteSpaceId":"sitesp_ySrl5","description":"Making message handlers asynchronous with a single attribute","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"647sf4AWgVVwE2UWLLII","title":"Asynchronous Message Bus (Gateways)","pathname":"/modelling/asynchronous-handling/asynchronous-message-bus-gateways","siteSpaceId":"sitesp_ySrl5","description":"Asynchronous Message Bus Gateways for channel-wide async processing","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"dwCNMDZz4DVtLzw5Pwqd","title":"Delaying Messages","pathname":"/modelling/asynchronous-handling/delaying-messages","siteSpaceId":"sitesp_ySrl5","description":"Delaying message delivery for scheduled processing","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"KPi0pFtRB7FJA2jQJ6GQ","title":"Time to Live","pathname":"/modelling/asynchronous-handling/time-to-live","siteSpaceId":"sitesp_ySrl5","description":"Time to live for automatic message expiration","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"b5u9LjXyl2C6HD9YVe9K","title":"Message Priority","pathname":"/modelling/asynchronous-handling/message-priority","siteSpaceId":"sitesp_ySrl5","description":"Message priority for controlling processing order","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"-M2wmTRZNDPSMp7IBCsL","title":"Scheduling","pathname":"/modelling/asynchronous-handling/scheduling","siteSpaceId":"sitesp_ySrl5","description":"Scheduling PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"W1Ddrljy41zrP0GKodAt","title":"Dynamic Message Channels","pathname":"/modelling/asynchronous-handling/dynamic-message-channels","siteSpaceId":"sitesp_ySrl5","description":"Dynamic message channels for per-tenant routing and isolation","breadcrumbs":[{"label":"Modelling"},{"label":"Asynchronous Handling and Scheduling"}]},{"id":"-MZYcVC-ENtQHuK1A1oC","title":"Distributed Bus and Microservices","pathname":"/modelling/microservices-php","siteSpaceId":"sitesp_ySrl5","description":"Implementing Microservices and Event Driven Architecture in PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"piJ9PjqYVW2ESFI2mCyF","title":"Distributed Bus","pathname":"/modelling/microservices-php/distributed-bus","siteSpaceId":"sitesp_ySrl5","description":"Distributed Bus for cross-service messaging in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"}]},{"id":"zIiCp9256Syy8nTTQIo7","title":"Distributed Bus Interface","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-interface","siteSpaceId":"sitesp_ySrl5","description":"Distributed Bus Interface for sending commands and events across services","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"}]},{"id":"8xqdmSBUWxcSigU5NTDR","title":"Distributed Bus with Service Map","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map","siteSpaceId":"sitesp_ySrl5","description":"Distributed Bus with Service Map for multi-broker microservice communication","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"}]},{"id":"Y0S2x5RpfDDivZYa8t4L","title":"Configuration","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map/configuration","siteSpaceId":"sitesp_ySrl5","description":"Configuring Distributed Bus with Service Map","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"Distributed Bus with Service Map"}]},{"id":"23Scv7ZWTQpgagLv8xeR","title":"Sharing Events with Streaming Channels","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map/sharing-events-with-streaming-channels","siteSpaceId":"sitesp_ySrl5","description":"Sharing events between services with streaming channels","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"Distributed Bus with Service Map"}]},{"id":"XrgI47brRfA0cFEsnRoH","title":"Custom Features","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map/custom-features","siteSpaceId":"sitesp_ySrl5","description":"Custom features for Distributed Bus with Service Map","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"Distributed Bus with Service Map"}]},{"id":"O9xuYB3VS5WKbVBuAQXa","title":"Shared Service Map","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map/shared-service-map","siteSpaceId":"sitesp_ySrl5","description":"Shared Service Map for centralized service topology","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"Distributed Bus with Service Map"}]},{"id":"IorxpVQdYQLPNGU8yt98","title":"Non-Ecotone Application integration","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map/non-ecotone-application-integration","siteSpaceId":"sitesp_ySrl5","description":"Integrating with other Languages and Frameworks","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"Distributed Bus with Service Map"}]},{"id":"SNlNZwGZnGJgU16MeckZ","title":"Testing","pathname":"/modelling/microservices-php/distributed-bus/distributed-bus-with-service-map/testing","siteSpaceId":"sitesp_ySrl5","description":"Testing Distributed Bus and cross-service messaging","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"Distributed Bus with Service Map"}]},{"id":"rwoXKfl61LeXiZjG23xc","title":"AMQP Distributed Bus (Legacy)","pathname":"/modelling/microservices-php/distributed-bus/amqp-distributed-bus-rabbitmq","siteSpaceId":"sitesp_ySrl5","description":"AMQP Distributed Bus with RabbitMQ for legacy inter-service communication","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"}]},{"id":"R6btE7hiXzThrQoRZsON","title":"Configuration","pathname":"/modelling/microservices-php/distributed-bus/amqp-distributed-bus-rabbitmq/configuration","siteSpaceId":"sitesp_ySrl5","description":"Configuring AMQP Distributed Bus with RabbitMQ","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"},{"label":"Distributed Bus"},{"label":"AMQP Distributed Bus (Legacy)"}]},{"id":"2Bk6dlTzV4Y3bIyjyi3t","title":"Message Consumer","pathname":"/modelling/microservices-php/message-consumer","siteSpaceId":"sitesp_ySrl5","description":"Message Consumer for consuming from external message brokers","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"}]},{"id":"SNfWtKOFIIGjq57vxqf5","title":"Message Publisher","pathname":"/modelling/microservices-php/message-publisher","siteSpaceId":"sitesp_ySrl5","description":"Message Publisher for publishing to external message brokers","breadcrumbs":[{"label":"Modelling"},{"label":"Distributed Bus and Microservices"}]},{"id":"R0nySF0UjsSa3MnWDuEF","title":"Business Workflows","pathname":"/modelling/business-workflows","siteSpaceId":"sitesp_ySrl5","description":"Building business workflows with Sagas, Orchestrators, and Handler Chaining in PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"XatYCxSffwonCKodsErn","title":"Connecting Handlers with Channels","pathname":"/modelling/business-workflows/connecting-handlers-with-channels","siteSpaceId":"sitesp_ySrl5","description":"Learn how to connect message handlers using channels to build workflows","breadcrumbs":[{"label":"Modelling"},{"label":"Business Workflows"}]},{"id":"x1zQg22rLM64wiWvDXZn","title":"Sagas: Workflows That Remember","pathname":"/modelling/business-workflows/sagas","siteSpaceId":"sitesp_ySrl5","description":"Learn how to build long-running workflows that remember state using Sagas","breadcrumbs":[{"label":"Modelling"},{"label":"Business Workflows"}]},{"id":"ogQdjD8tpjS6dAZuN16J","title":"Orchestrators: Declarative Workflow Automation","pathname":"/modelling/business-workflows/orchestrators","siteSpaceId":"sitesp_ySrl5","description":"Learn how to build predefined and dynamic workflows using Orchestrator","breadcrumbs":[{"label":"Modelling"},{"label":"Business Workflows"}]},{"id":"dQqBHHV8aG6N7oHWJmIB","title":"Handling Failures","pathname":"/modelling/business-workflows/handling-failures","siteSpaceId":"sitesp_ySrl5","description":"Handling Failures and Exceptions in Sagas and Process Managers","breadcrumbs":[{"label":"Modelling"},{"label":"Business Workflows"}]},{"id":"EvfViTwbnlkA5PanMvwu","title":"Migrations / Storage","pathname":"/modelling/migrations-storage","siteSpaceId":"sitesp_ySrl5","description":"Database migrations and storage management in Ecotone PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"m1Smn2HlQD768cLDUkdS","title":"Testing Support","pathname":"/modelling/testing-support","siteSpaceId":"sitesp_ySrl5","description":"Testing message-driven applications with Ecotone PHP","breadcrumbs":[{"label":"Modelling"}]},{"id":"5xkK2rzu0rNsToKeYzhr","title":"Testing Messaging","pathname":"/modelling/testing-support/testing-messaging","siteSpaceId":"sitesp_ySrl5","description":"Testing Messaging architecture in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Testing Support"}]},{"id":"nA85vW3qm3WIYqFiCjLH","title":"Testing Aggregates and Sagas with Message Flows","pathname":"/modelling/testing-support/testing-aggregates-and-sagas-with-message-flows","siteSpaceId":"sitesp_ySrl5","description":"Testing Aggregate, Saga in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Testing Support"}]},{"id":"yG28nDrwh0fQbvJV7Bil","title":"Testing Event Sourcing Applications","pathname":"/modelling/testing-support/testing-event-sourcing-applications","siteSpaceId":"sitesp_ySrl5","description":"Testing Event Sourcing applications in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Testing Support"}]},{"id":"dK3KEzTuJYoQ3N8tvcKQ","title":"Testing Asynchronous Messaging","pathname":"/modelling/testing-support/testing-asynchronous-messaging","siteSpaceId":"sitesp_ySrl5","description":"Testing asynchronous communication in PHP","breadcrumbs":[{"label":"Modelling"},{"label":"Testing Support"}]},{"id":"-LwhtpLOYN3bqGt0aLKh","title":"Overview","pathname":"/messaging/overview","siteSpaceId":"sitesp_ySrl5","description":"Event driven architecture PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"MpraT5T0W1vbc4DeBtk9","title":"Multi-Tenancy Support","pathname":"/messaging/multi-tenancy-support","siteSpaceId":"sitesp_ySrl5","description":"Multi-Tenancy Ecotone, Symfony, Laravel, DDD, CQRS, Event Sourcing","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"Mxhso9cw3Bn9IzEvDNXV","title":"Getting Started","pathname":"/messaging/multi-tenancy-support/getting-started","siteSpaceId":"sitesp_ySrl5","description":"Getting started with multi-tenancy in Ecotone PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"}]},{"id":"EL9eIeLJ4d5KKWvKkDmZ","title":"Any Framework Configuration","pathname":"/messaging/multi-tenancy-support/getting-started/any-framework-configuration","siteSpaceId":"sitesp_ySrl5","description":"Multi-tenancy configuration for any PHP framework","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Getting Started"}]},{"id":"7wuYjbdaFd3DJcny2iuo","title":"Symfony and Doctrine ORM","pathname":"/messaging/multi-tenancy-support/getting-started/symfony-and-doctrine-orm","siteSpaceId":"sitesp_ySrl5","description":"Multi-tenancy configuration for Symfony and Doctrine ORM","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Getting Started"}]},{"id":"U5CWPHKgGZCXdBwWCSTL","title":"Laravel","pathname":"/messaging/multi-tenancy-support/getting-started/laravel","siteSpaceId":"sitesp_ySrl5","description":"Multi-tenancy configuration for Laravel with Ecotone","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Getting Started"}]},{"id":"9AW9S8axmEOXmcdmmjQx","title":"Different Scenarios","pathname":"/messaging/multi-tenancy-support/different-scenarios","siteSpaceId":"sitesp_ySrl5","description":"Multi-tenancy scenarios and advanced configurations","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"}]},{"id":"yuBkGcJJEL3mGpjbDuox","title":"Hooking into Tenant Switch","pathname":"/messaging/multi-tenancy-support/different-scenarios/hooking-into-tenant-switch","siteSpaceId":"sitesp_ySrl5","description":"Hooking into tenant switch for custom tenant initialization","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Different Scenarios"}]},{"id":"nVN0UOphamdA8GFeansh","title":"Shared and Multi Database Tenants","pathname":"/messaging/multi-tenancy-support/different-scenarios/shared-and-multi-database-tenants","siteSpaceId":"sitesp_ySrl5","description":"Shared and multi-database tenant configurations","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Different Scenarios"}]},{"id":"Kh0UWhcF9UnoShQAqQh2","title":"Accessing Current Tenant in Message Handler","pathname":"/messaging/multi-tenancy-support/different-scenarios/accessing-current-tenant-in-message-handler","siteSpaceId":"sitesp_ySrl5","description":"Accessing the current tenant context in message handlers","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Different Scenarios"}]},{"id":"5qFpa6lNY4F8KFczwVIM","title":"Deriving Tenant from Inbound Messages","pathname":"/messaging/multi-tenancy-support/different-scenarios/deriving-tenant-from-inbound-messages","siteSpaceId":"sitesp_ySrl5","description":"Deriving the tenant header from external messages that do not carry tenant metadata","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Different Scenarios"}]},{"id":"dLMmOnbPLQOvo3WXn22s","title":"Events and Tenant Propagation","pathname":"/messaging/multi-tenancy-support/different-scenarios/events-and-tenant-propagation","siteSpaceId":"sitesp_ySrl5","description":"Event publishing and tenant context propagation","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Different Scenarios"}]},{"id":"qC5JeODUhloC7pnFlqjf","title":"Multi-Tenant aware Dead Letter","pathname":"/messaging/multi-tenancy-support/different-scenarios/multi-tenant-aware-dead-letter","siteSpaceId":"sitesp_ySrl5","description":"Multi-tenant aware dead letter queue for tenant-isolated error handling","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"},{"label":"Different Scenarios"}]},{"id":"JslAV593mzY1tA6qG62S","title":"Advanced Queuing Strategies","pathname":"/messaging/multi-tenancy-support/advanced-queuing-strategies","siteSpaceId":"sitesp_ySrl5","description":"Advanced queuing strategies for multi-tenant message processing","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Multi-Tenancy Support"}]},{"id":"nYUtb5OQlaLO4BrIkJtq","title":"Document Store","pathname":"/messaging/document-store","siteSpaceId":"sitesp_ySrl5","description":"Document Store for schema-less data storage in Ecotone PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"LyEjX3CNRw6l5NWq6Dq9","title":"Console Commands","pathname":"/messaging/console-commands","siteSpaceId":"sitesp_ySrl5","description":"Console commands for managing Ecotone message consumers and projections","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"-LwJfGruLsbqWDD7Qp8a","title":"Messaging concepts","pathname":"/messaging/messaging-concepts","siteSpaceId":"sitesp_ySrl5","description":"Core messaging concepts: Messages, Channels, Endpoints, and Gateways","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"-LwhsETO-LK-lIFYfQaN","title":"Message","pathname":"/messaging/messaging-concepts/message","siteSpaceId":"sitesp_ySrl5","description":"Enterprise Integration Patterns PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"}]},{"id":"-LwhsdVFXtDs4bqRr4w1","title":"Message Channel","pathname":"/messaging/messaging-concepts/message-channel","siteSpaceId":"sitesp_ySrl5","description":"Message Channel PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"}]},{"id":"-LwJfOPi0OKWs5SCKm7r","title":"Message Endpoints/Handlers","pathname":"/messaging/messaging-concepts/message-endpoint","siteSpaceId":"sitesp_ySrl5","description":"Message Endpoint PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"}]},{"id":"-Lwhwybp6gXWN1BpzhA4","title":"Internal Message Handler","pathname":"/messaging/messaging-concepts/message-endpoint/service-activator","siteSpaceId":"sitesp_ySrl5","description":"Service Activator PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"},{"label":"Message Endpoints/Handlers"}]},{"id":"-LwhqtnS4JEFCcn5_PU5","title":"Message Router","pathname":"/messaging/messaging-concepts/message-endpoint/message-routing","siteSpaceId":"sitesp_ySrl5","description":"Message Router PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"},{"label":"Message Endpoints/Handlers"}]},{"id":"-LwiHBBprK6dLRHd8x7D","title":"Splitter","pathname":"/messaging/messaging-concepts/message-endpoint/splitter","siteSpaceId":"sitesp_ySrl5","description":"Splitter PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"},{"label":"Message Endpoints/Handlers"}]},{"id":"-M3NHe4spQAgGRiqowAY","title":"Consumer","pathname":"/messaging/messaging-concepts/consumer","siteSpaceId":"sitesp_ySrl5","description":"Consumer PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"}]},{"id":"-LwhtSYhgD4TE4lcvMhv","title":"Messaging Gateway","pathname":"/messaging/messaging-concepts/messaging-gateway","siteSpaceId":"sitesp_ySrl5","description":"Message Gateway PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"}]},{"id":"xd0i4EAq0nyDiiHg2bq6","title":"Inbound/Outbound Channel Adapter","pathname":"/messaging/messaging-concepts/inbound-outbound-channel-adapter","siteSpaceId":"sitesp_ySrl5","description":"Inbound and Outbound Channel Adapters for external system integration","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Messaging concepts"}]},{"id":"-LwJcG-RHMkdjeZmqpPy","title":"Method Invocation And Conversion","pathname":"/messaging/conversion","siteSpaceId":"sitesp_ySrl5","description":"Method invocation and message conversion in Ecotone PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"-LwiixUrgqNF3ZbrnBYV","title":"Method Invocation","pathname":"/messaging/conversion/method-invocation","siteSpaceId":"sitesp_ySrl5","description":"Method Invocation PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Method Invocation And Conversion"}]},{"id":"-M2i-zDW5OcAcBOToKe0","title":"Conversion","pathname":"/messaging/conversion/conversion","siteSpaceId":"sitesp_ySrl5","description":"Conversion PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Method Invocation And Conversion"}]},{"id":"OXEmfrXZdniTWMsdi9i7","title":"Payload Conversion","pathname":"/messaging/conversion/conversion/payload-conversion","siteSpaceId":"sitesp_ySrl5","description":"Converting message payloads between formats in Ecotone PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Method Invocation And Conversion"},{"label":"Conversion"}]},{"id":"xYuotZzf8tWiPjNLXCcc","title":"Headers Conversion","pathname":"/messaging/conversion/conversion/headers-conversion","siteSpaceId":"sitesp_ySrl5","description":"Converting message headers in Ecotone PHP","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Method Invocation And Conversion"},{"label":"Conversion"}]},{"id":"-MWp0zgzmyYdwLw93Uqp","title":"Service (Application) Configuration","pathname":"/messaging/service-application-configuration","siteSpaceId":"sitesp_ySrl5","description":"Ecotone Framework customization","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"6zr7PdArt9dYpzJ12ykw","title":"Contributing to Ecotone","pathname":"/messaging/contributing-to-ecotone","siteSpaceId":"sitesp_ySrl5","description":"Contributing to Ecotone framework development","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"}]},{"id":"N96598h6rvXWdsHD5POt","title":"How Ecotone works under the hood","pathname":"/messaging/contributing-to-ecotone/how-ecotone-works-under-the-hood","siteSpaceId":"sitesp_ySrl5","description":"How Ecotone works under the hood — internal architecture","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"}]},{"id":"EqGgXumG9iyxDFESwFTb","title":"Ecotone Phases","pathname":"/messaging/contributing-to-ecotone/ecotone-phases","siteSpaceId":"sitesp_ySrl5","description":"Ecotone bootstrap phases and lifecycle","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"}]},{"id":"fLirE4tqTEhYO3VBpYq8","title":"Registering new Module Package","pathname":"/messaging/contributing-to-ecotone/registering-new-module-package","siteSpaceId":"sitesp_ySrl5","description":"Registering a new module package in Ecotone","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"}]},{"id":"gZ3FxXzofM04lPTXlzPn","title":"Demo Integration with SQS","pathname":"/messaging/contributing-to-ecotone/demo-integration-with-sqs","siteSpaceId":"sitesp_ySrl5","description":"Demo integration with Amazon SQS in Ecotone","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"}]},{"id":"BwF8dh0EzCDoIY2MIzed","title":"Preparation","pathname":"/messaging/contributing-to-ecotone/demo-integration-with-sqs/preparation","siteSpaceId":"sitesp_ySrl5","description":"Preparing the SQS integration demo environment","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"},{"label":"Demo Integration with SQS"}]},{"id":"J2mj2KTVlfea2JT5NoNw","title":"Inbound and Outbound Adapters and Message Channel","pathname":"/messaging/contributing-to-ecotone/demo-integration-with-sqs/inbound-and-outbound-adapters-and-message-channel","siteSpaceId":"sitesp_ySrl5","description":"Building SQS inbound and outbound adapters and message channels","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"},{"label":"Demo Integration with SQS"}]},{"id":"KaAwkHFDAGLYsUNNVj4u","title":"Message Consumer and Publisher","pathname":"/messaging/contributing-to-ecotone/demo-integration-with-sqs/message-consumer-and-publisher","siteSpaceId":"sitesp_ySrl5","description":"Building SQS message consumer and publisher","breadcrumbs":[{"label":"Messaging and Ecotone In Depth"},{"label":"Contributing to Ecotone"},{"label":"Demo Integration with SQS"}]},{"id":"-M2sAMepe8ACr0Pr6baa","title":"Overview","pathname":"/modules/overview","siteSpaceId":"sitesp_ySrl5","description":"Overview of Ecotone modules for Laravel, Symfony, and message brokers","breadcrumbs":[{"label":"Modules"}]},{"id":"Onfz1jGFLiQe5wMfRWGB","title":"Symfony","pathname":"/modules/symfony","siteSpaceId":"sitesp_ySrl5","description":"Symfony CQRS DDD Event Sourcing with Ecotone","breadcrumbs":[{"label":"Modules"}]},{"id":"-M2sBJiIYy8K0IpVD5he","title":"Symfony Configuration","pathname":"/modules/symfony/symfony-ddd-cqrs-event-sourcing","siteSpaceId":"sitesp_ySrl5","description":"Event Sourcing DDD CQRS Symfony PHP","breadcrumbs":[{"label":"Modules"},{"label":"Symfony"}]},{"id":"r5swKwarcjZU438ftwl8","title":"Symfony Database Connection (DBAL Module)","pathname":"/modules/symfony/symfony-database-connection-dbal-module","siteSpaceId":"sitesp_ySrl5","description":"Database connection with DBAL module in Symfony","breadcrumbs":[{"label":"Modules"},{"label":"Symfony"}]},{"id":"il7XL9QX06bTosGq5L1f","title":"Doctrine ORM","pathname":"/modules/symfony/doctrine-orm","siteSpaceId":"sitesp_ySrl5","description":"Using Doctrine ORM with Ecotone Aggregates in Symfony","breadcrumbs":[{"label":"Modules"},{"label":"Symfony"}]},{"id":"2TD04aPa8ANPLvI2yCdk","title":"Symfony Messenger Transport","pathname":"/modules/symfony/symfony-messenger-transport","siteSpaceId":"sitesp_ySrl5","description":"Symfony Messenger CQRS DDD","breadcrumbs":[{"label":"Modules"},{"label":"Symfony"}]},{"id":"JevbaemoPzGHDbBdb0lT","title":"Laravel","pathname":"/modules/laravel","siteSpaceId":"sitesp_ySrl5","description":"Laravel CQRS DDD Event Sourcing with Ecotone","breadcrumbs":[{"label":"Modules"}]},{"id":"-M2sBRXelwsal66mUaeb","title":"Laravel Configuration","pathname":"/modules/laravel/laravel-ddd-cqrs-event-sourcing","siteSpaceId":"sitesp_ySrl5","description":"Event Sourcing DDD CQRS Laravel","breadcrumbs":[{"label":"Modules"},{"label":"Laravel"}]},{"id":"eA6tFPCA53Flpb3NSRX6","title":"Database Connection (DBAL Module)","pathname":"/modules/laravel/database-connection-dbal-module","siteSpaceId":"sitesp_ySrl5","description":"Database connection with DBAL module in Laravel","breadcrumbs":[{"label":"Modules"},{"label":"Laravel"}]},{"id":"t0b5VOkzmS9VuixCMTCm","title":"Eloquent","pathname":"/modules/laravel/eloquent","siteSpaceId":"sitesp_ySrl5","description":"Using Eloquent ORM with Ecotone Aggregates in Laravel","breadcrumbs":[{"label":"Modules"},{"label":"Laravel"}]},{"id":"BanuKDVwg1sJK1foI7AC","title":"Laravel Queues","pathname":"/modules/laravel/laravel-queues","siteSpaceId":"sitesp_ySrl5","description":"Using Laravel Queues as async message channels in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"Laravel"}]},{"id":"dUBfXeFKfElV2JFuwG2Z","title":"Laravel Octane","pathname":"/modules/laravel/laravel-octane","siteSpaceId":"sitesp_ySrl5","description":"Running Ecotone with Laravel Octane for high-performance PHP","breadcrumbs":[{"label":"Modules"},{"label":"Laravel"}]},{"id":"-MWsP9p4noo3bvcGrrE-","title":"Ecotone Lite","pathname":"/modules/ecotone-lite","siteSpaceId":"sitesp_ySrl5","description":"Ecotone Lite for standalone PHP applications without Laravel or Symfony","breadcrumbs":[{"label":"Modules"}]},{"id":"zqsapGvgYf5nCMC170mw","title":"Logging","pathname":"/modules/ecotone-lite/logging","siteSpaceId":"sitesp_ySrl5","description":"Configuring logging in Ecotone Lite applications","breadcrumbs":[{"label":"Modules"},{"label":"Ecotone Lite"}]},{"id":"oOyjMNvopeNG2Am8BYgZ","title":"Database Connection (DBAL Module)","pathname":"/modules/ecotone-lite/database-connection-dbal-module","siteSpaceId":"sitesp_ySrl5","description":"Database connection with DBAL module in Ecotone Lite","breadcrumbs":[{"label":"Modules"},{"label":"Ecotone Lite"}]},{"id":"-M2sBC01Yp86SNGzrgWZ","title":"JMS Converter","pathname":"/modules/jms-converter","siteSpaceId":"sitesp_ySrl5","description":"PHP Converters Serializers Deserializers","breadcrumbs":[{"label":"Modules"}]},{"id":"P7lP4EecYP78szeyJER3","title":"OpenTelemetry (Tracing and Metrics)","pathname":"/modules/opentelemetry-tracing-and-metrics","siteSpaceId":"sitesp_ySrl5","description":"OpenTelemetry integration for tracing and metrics in Ecotone PHP","breadcrumbs":[{"label":"Modules"}]},{"id":"c54nV0q37XvSHEimgEQp","title":"Configuration","pathname":"/modules/opentelemetry-tracing-and-metrics/configuration","siteSpaceId":"sitesp_ySrl5","description":"Configuring OpenTelemetry tracing and metrics in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"OpenTelemetry (Tracing and Metrics)"}]},{"id":"-M2sB77gprr4-MpHZjzT","title":"RabbitMQ Support","pathname":"/modules/amqp-support-rabbitmq","siteSpaceId":"sitesp_ySrl5","description":"Asynchronous PHP RabbitMQ","breadcrumbs":[{"label":"Modules"}]},{"id":"Xe0nYcVkOyc4CUA7firn","title":"Configuration","pathname":"/modules/amqp-support-rabbitmq/configuration","siteSpaceId":"sitesp_ySrl5","description":"Configuring RabbitMQ connection and exchanges in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"RabbitMQ Support"}]},{"id":"0TkBjFTtotI6YV8RFgup","title":"Message Channel","pathname":"/modules/amqp-support-rabbitmq/message-channel","siteSpaceId":"sitesp_ySrl5","description":"RabbitMQ message channels for async processing in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"RabbitMQ Support"}]},{"id":"Ocn2KqxaqfPtZ7Sylk90","title":"Rabbit Consumer","pathname":"/modules/amqp-support-rabbitmq/rabbit-consumer","siteSpaceId":"sitesp_ySrl5","description":"Production-grade RabbitMQ consumer with Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"RabbitMQ Support"}]},{"id":"G5BLUKc6RBiyza39FoGa","title":"Message Publisher","pathname":"/modules/amqp-support-rabbitmq/message-publisher","siteSpaceId":"sitesp_ySrl5","description":"Publishing messages to RabbitMQ with Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"RabbitMQ Support"}]},{"id":"glYcXGEX6jAXEQjMH5Jg","title":"Kafka Support","pathname":"/modules/kafka-support","siteSpaceId":"sitesp_ySrl5","description":"Kafka integration for high-throughput event streaming in PHP","breadcrumbs":[{"label":"Modules"}]},{"id":"AComgjucYoOwaegh3Weq","title":"Configuration","pathname":"/modules/kafka-support/configuration","siteSpaceId":"sitesp_ySrl5","description":"Configuring Kafka connection and topics in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"Kafka Support"}]},{"id":"Y9PM24jpSQU6HraYt9Ho","title":"Message partitioning","pathname":"/modules/kafka-support/message-partitioning","siteSpaceId":"sitesp_ySrl5","description":"Message partitioning for ordered processing with Kafka","breadcrumbs":[{"label":"Modules"},{"label":"Kafka Support"}]},{"id":"xSov4S8r0oZbAMtCJXVE","title":"Message Channel","pathname":"/modules/kafka-support/message-channel","siteSpaceId":"sitesp_ySrl5","description":"Kafka message channels for async processing in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"Kafka Support"}]},{"id":"Isvnae2YcS5WZtwAPgWe","title":"Kafka Consumer","pathname":"/modules/kafka-support/kafka-consumer","siteSpaceId":"sitesp_ySrl5","description":"Kafka consumer for event streaming in Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"Kafka Support"}]},{"id":"ZHLpyH5MU6SujvxhTK8r","title":"Message Publisher","pathname":"/modules/kafka-support/message-publisher","siteSpaceId":"sitesp_ySrl5","description":"Publishing messages to Kafka with Ecotone","breadcrumbs":[{"label":"Modules"},{"label":"Kafka Support"}]},{"id":"-M2sBbb2SIlt1NeHqD_l","title":"DBAL Support","pathname":"/modules/dbal-support","siteSpaceId":"sitesp_ySrl5","description":"Transactions, Asynchronous, Dead Letter Queue PHP DBAL","breadcrumbs":[{"label":"Modules"}]},{"id":"1sJaKf0pzaoOM4xxxHSs","title":"Amazon SQS Support","pathname":"/modules/amazon-sqs-support","siteSpaceId":"sitesp_ySrl5","description":"Ecotone support for Amazon SQS PHP","breadcrumbs":[{"label":"Modules"}]},{"id":"LOIrMzBUVbTdeNoGYPZZ","title":"Redis Support","pathname":"/modules/redis-support","siteSpaceId":"sitesp_ySrl5","description":"Ecotone support for Redis","breadcrumbs":[{"label":"Modules"}]},{"id":"J2xiMV9UpswgdZry0R8E","title":"Data Protection","pathname":"/modules/data-protection","siteSpaceId":"sitesp_ySrl5","icon":"file-shield","description":"Ecotone enables protection for data sent in messages.","breadcrumbs":[{"label":"Modules"}]},{"id":"Bn9F5p1btqaieYTmdBsO","title":"Channel Encryption","pathname":"/modules/data-protection/channel-encryption","siteSpaceId":"sitesp_ySrl5","description":"Protect Messages using channel encryption","breadcrumbs":[{"label":"Modules"},{"label":"Data Protection","icon":"file-shield"}]},{"id":"XTFO5PnJxzD048et50UV","title":"Message Encryption","pathname":"/modules/data-protection/message-encryption","siteSpaceId":"sitesp_ySrl5","description":"Protect Messages using direct annotations","breadcrumbs":[{"label":"Modules"},{"label":"Data Protection","icon":"file-shield"}]},{"id":"Fip3dCz0rFsWP4Q3nixx","title":"AI Integration","pathname":"/other/ai-integration","siteSpaceId":"sitesp_ySrl5","description":"AI integration with Ecotone — MCP Server, Agent Skills, and llms.txt","breadcrumbs":[{"label":"Other"}]},{"id":"HSYo4LIqQfX1BpxIrBUw","title":"Contact, Workshops and Support","pathname":"/other/contact-workshops-and-support","siteSpaceId":"sitesp_ySrl5","description":"Get private workshops, sessions from Ecotone and Message Driven Architecture","breadcrumbs":[{"label":"Other"}]}]}