Сколько баз данных в архитектуре управляемых событиями Microservices?
Я прочитал тонны документации, постов в блогах и примеров о CQRS с EventSource в качестве полезной архитектуры в системе Microservice.
Популярным примером является приложение банковского перевода:
Ясно, что есть четыре микросервиса, но я не понимаю, потому что микросервисы "командной стороны" не имеют своей собственной базы данных.
По этому образу все микросервисы используют одну и ту же базу данных eventStore, что должно быть против паттерна микросервисов?
А каким должен быть EventStore db? Один стол? Одна таблица для каждой услуги?
3 ответа
Большинство решений касаются компромиссов, и это не исключение. В обычном определении микросервисов каждый сервис будет иметь свою собственную базу данных по причинам, упомянутым @thiago-custodio. Вы получаете полное разделение и инкапсуляцию вашего сервиса. Это, однако, увеличивает нагрузку на операционные аспекты бизнеса, поскольку теперь у вас есть N баз данных для администрирования. У вас также есть новая проблема "как все говорят друг с другом", которую нужно решить. Это может или не может быть проблемой для вас.
Вы можете получить некоторые преимущества разделения служб и инкапсуляции от совместного использования базы данных, но, например, имея отдельные схемы для каждой службы. Вы все еще получаете некоторый уровень изоляции на уровне базы данных, но уменьшаете свою операционную сложность. Опять же, компромиссы.
Я рассматриваю использование единственного хранилища событий / очереди сообщений как приемлемый компромисс, чтобы сделать возможным взаимодействие между множеством сервисов.
Понятно, что есть четыре микросервиса,
Не обязательно просто просматривать диаграмму вне контекста. Есть два контроллера, которые записывают события в хранилище событий, и контроллер, который возвращает запрос. Это похоже на диаграмму, объясняющую CQRS, а не на микросервисы. CQRS не является архитектурой верхнего уровня - вы должны применять ее в микросервисе.
но я не понимаю, потому что у микросервисов "командной стороны" нет собственной базы данных.
Хранилище событий - это база данных. На стороне запроса есть отдельная база данных, которая будет оптимизирована для запросов.
Решил, что мне нужно больше места, чтобы уточнить мои комментарии
Понятно, что есть четыре микроуслуги,
Я не думаю, что это понятно.
Бывает, что это конкретное изображение взято с https://github.com/cer/event-sourcing-examples
В обзоре Ричардсон пишет:
One of the neat things about the modular architecture is
that there are two ways to deploy these four services:
monolithic-service - all services are packaged as a single Spring Boot executable JAR
Microservices - three separate Spring Boot executable JARs
accounts-command-side-service - command-side accounts
transactions-command-side-service - command-side money transfers
accounts-query-side-service - Account View Updater and Account View Reader
Представление в Scala By the Bay, он вызывает шаблон одной микросервисной публикации в хранилище событий, а второй микросервис подписывается на эти события и обновляет хранилище представлений.
Поэтому я думаю, что вы можете привести справедливые аргументы в пользу того, чтобы считать это одним, двумя, тремя или четырьмя микросервисами.
При подсчете нужно учитывать одну вещь: адаптер представления учетной записи должен иметь общее понимание с учетными записями и общее понимание с переводами, чтобы понять информацию о состоянии, содержащуюся в событиях, для создания представления (представление учетной записи) Читателю не нужно это общее понимание, потому что оно просто копирует данные из хранилища представлений).
Уди Дахану есть что сказать о границах обслуживания; в частности, что вы сохраняете слабую связь между вашими службами, ограничивая объем данных, публично используемых вашими службами.
Мое применение его руководства к этой диаграмме говорит мне, что представление учетной записи и два агрегата должны быть частью одной границы, потому что все они имеют доступ к данным, которые являются частными для этой службы.
Конечно, вы все равно можете проектировать эти четыре сервисных компонента по отдельности, если вы будете осторожны, чтобы сохранить обратно совместимые изменения в схеме событий.
Ясно, что есть четыре микросервиса, но я не понимаю, потому что микросервисы "командной стороны" не имеют своей собственной базы данных.
Вы можете рассматривать эти два микросервиса как имеющие разные хранилища логических событий, которые оказываются одним и тем же физическим хранилищем. Возможно, возникнет некоторая головная боль, если вы решите, что одно из этих логических хранилищ необходимо перенести, но совокупные потоки событий изолированы друг от друга, поэтому вам не нужно сильно беспокоиться о связи между учетными записями и переносами.
А каким должен быть EventStore db? Один стол? Одна таблица для каждой услуги?
Типичная реляционная схема для хранилища событий будет обрабатывать само событие как большой двоичный объект и предоставлять некоторые метаданные (например, идентификатор события), чтобы его можно было объединить с другими таблицами. Таким образом, универсальное хранилище, вероятно, выглядит как одна таблица для хранения событий, а другая таблица для хранения потоков событий. Есть несколько ссылок на обсуждение реляционных схем при хранении событий при использовании источников событий.
Если вы хотите разделить / разделить схему на несколько физических таблиц, вы можете сделать это тоже.
Есть также нереляционные магазины, которые вы можете использовать. Если вы посмотрите на детали Event Store (с открытым исходным кодом), вы можете многое узнать о том, как реализовать магазин.
Или вы можете просто рассматривать это как черный ящик.
По моему мнению и согласно тому, что я уже читал об архитектуре микросервисов, идея каждого сервиса, имеющего собственный механизм персистентности, состоит в том, чтобы создать независимый сервис, который мог бы быть полностью переписан, если это необходимо, без воздействия на потребителей. (пока вы держите контракт запрос / ответ для клиента).
Это децентрализованное управление данными. характерно, и делая микросервисы, использующие одну и ту же базу данных, вы этого не добьетесь
Для дальнейшего чтения: