выполняющей действие, либо запросом, возвращающим данные, но не одновременно. “Объектно-ориентированное конструирование программных систем” Бертран Мейер, 1997 г. CQS
function findByEmail(string $email): ?Customer; public function registerCustomer(string $email): int; public function changeEmail(int $id, string $newEmail): bool; public function makePreferred(int $id, float $discount): float; public function removeCustomer(int $id): bool; } CQS interface CustomerService { public function getWithID(int $id): Customer; public function findByEmail(string $email): ?Customer; public function registerCustomer(int $id, string $email): void; public function changeEmail(int $id, string $newEmail): void; public function makePreferred(int $id, float $discount): void; public function removeCustomer(int $id): void; } CRUD vs CQS
$id): Customer; public function findByEmail(string $email): ?Customer; public function registerCustomer(int $id, string $email): void; public function changeEmail(int $id, string $newEmail): void; public function makePreferred(int $id, float $discount): void; public function removeCustomer(int $id): void; } CQRS interface CustomerReadService { public function getWithID(int $id): Customer; public function findByEmail(string $email): ?Customer; } interface CustomerWriteService { public function registerCustomer(int $id, string $email): void; public function changeEmail(int $id, string $newEmail): void; public function makePreferred(int $id, float $discount): void; public function removeCustomer(int $id): void; }
с использованием одного или нескольких каналов связи, так чтобы приложения могли общаться без необходимости знать конкретные детали друг о друге. “Шаблоны интеграции корпоративных приложений” Грегор Хоп, Бобби Вульф, 2016 г. Message-Based Architecture
Отображают действие пользователя • Имеют смысл в едином языке • Используют один обработчик • Именование в повелительном наклонении Типы сообщений в CQRS Query • Не меняют состояние приложения • Синхронная операция • Предоставляют данные клиенту • Используют один обработчик
function getWithID(int $id): Customer; public function findByEmail(string $email): ?Customer; } interface CustomerWriteService { public function registerCustomer(int $id, string $email): void; public function changeEmail(int $id, string $newEmail): void; public function makePreferred(int $id, float $discount): void; public function removeCustomer(int $id): void; } CQRS + Сообщения interface CustomerReadService { public function getWithID(GetCustomerWithID $query): Customer; public function findByEmail(FindCustomerByEmail $query): ?Customer; } interface CustomerWriteService { public function registerCustomer(RegisterCustomer $command): void; public function changeEmail(ChangeCustomerEmail $command): void; public function makePreferred(MakeCustomerPreferred $command): void; public function removeCustomer(RemoveCustomer $command): void; }
Какова средняя сумма пополнения баланса? • Сколько корзин не проходят оформления? • Какой E-mail был у пользователя N дней назад? И тут бизнес хочет знать...
текущее состояние. “Exploring CQRS and Event Sourcing: A journey into high scalability, availability, and maintainability with Windows Azure” Dominic Betts, 2013 г. Event Sourcing
будет построено с применением SOA, MBA, DDD, etc. и лишь часть его будет использовать CQRS и, возможно, Event Sourcing. SOA - Service-Oriented Architecture MBA - Message-Based Architecture DDD - Domain Driven Design