Микросервисы - используется ли технология хранилища событий (в решениях для поиска событий) всеми микросервисами?

Насколько мне позволяет понять мой небольшой текущий опыт, одна из основных концепций «микросервиса» заключается в том, что он полагается на свою собственную базу данных, которая не зависит от других микросервисов.

Если углубиться в то, как обрабатывать распределенные транзакции в системе микросервисов, лучшая стратегия, по-видимому, - это шаблон Event Sourcing, ядром которого является хранилище событий.

Совместно ли хранилище событий между разными микросервисами? Или существует несколько независимых баз данных хранилищ событий для каждого микросервиса и один общий брокер событий?

Если первым вариантом является решение, то с помощью CQRS я могу теперь предположить, что каждая база данных микросервиса предназначена для работы на стороне запроса, а общее хранилище событий находится на стороне команды. Это неправильное предположение?

И раз уж мы в теме: сколько повторных попыток мне нужно сделать в случае одновременной записи в Stream с использованием оптимистической блокировки?

Заранее большое спасибо за каждый совет, который вы можете мне дать!


person Christian Paesante    schedule 27.09.2018    source источник


Ответы (3)


Совместно ли хранилище событий между разными микросервисами? Или существует несколько независимых баз данных хранилищ событий для каждого микросервиса и один общий брокер событий?

С их точки зрения, каждый микросервис должен писать в собственное хранилище событий. Это может означать отдельные экземпляры или отдельные разделы внутри одного и того же экземпляра. Это позволяет масштабировать микросервисы независимо.

Если первый вариант является решением, используя CQRS, я могу теперь предположить, что каждая база данных микросервиса предназначена для работы на стороне запроса, а общее хранилище событий находится на стороне команды. Это неправильное предположение?

Вроде. Как я уже писал выше, каждый микросервис должен иметь собственное хранилище событий (или раздел внутри общего экземпляра). Микрослужба не должна добавлять события в другое хранилище событий микросервиса.

Что касается мероприятий по чтению, я считаю, что мероприятия по чтению в целом должны быть разрешены. Опрос хранилища событий - это простейшее (и, на мой взгляд, лучшее) решение для распространения изменений на другие микросервисы. Его преимущество заключается в том, что удаленный микросервис опрашивает с той скоростью, с которой он может, и с тем, какие события он хочет. Это можно очень хорошо масштабировать, создавая реплики хранилища событий, сколько это необходимо.

В некоторых случаях вы не хотите публиковать каждое событие домена из хранилища событий. Некоторые говорят, что могут существовать внутренние события домена, от которых другие микросервисы не должны зависеть. В этом случае вы можете пометить события как бесплатные (или нет) для внешнего использования.

Самым чистым решением для распространения изменений в микросервисе является наличие оперативных запросов, на которые могут подписаться другие микросервисы. Его преимущество состоит в том, что логика проекции не проникает в другие микросервисы, но также имеет тот недостаток, что порождающий микросервис должен определять + реализовывать эти запросы; вы можете сделать это, когда заметите, что другие микросервисы дублируют логику проекции. Примером этого запроса является общая стоимость заказа в приложении электронной коммерции. У вас может быть такой запрос WhatIsTheTotalPriceOfTheOrder, который публикуется каждый раз, когда элемент добавляется / удаляется / обновляется в Заказе.

И раз уж мы в теме: сколько попыток мне нужно сделать в случае одновременной записи в Stream с использованием оптимистической блокировки?

Столько, сколько вам нужно, то есть до тех пор, пока запись не завершится успешно. У вас может быть ограничение в 99999, чтобы вы могли обнаруживать, когда что-то ужасно не так с механизмом повтора. В любом случае одновременную запись следует повторить только тогда, когда запись выполняется одновременно в том же потоке (для одного экземпляра Aggregate), а не для всего хранилища событий.

person Constantin Galbenu    schedule 28.09.2018
comment
Спасибо! Вы действительно очистили мою голову от множества нечетких идей. - person Christian Paesante; 01.10.2018
comment
Еще одна вещь: как объяснил @VoiceOfUnreason, различные микросервисы не должны полагаться на тот факт, что события хранятся в одной и той же технологии хранилища событий. Это означает, что в идеальной архитектуре должен быть постоянный брокер, если вы публикуете свое сообщение, и это сообщение выбирается другим агентом и сохраняется в хранилище событий. Это единственный способ достичь атомарной публикации и хранения, но если событие выбирается и сохраняется, в то время как в середине также выбирается и сохраняется другое сообщение, это может привести к несогласованному состоянию. Идеи? - person Christian Paesante; 01.10.2018
comment
@ChristianPaesante Это общее правило, микросервисы не должны предполагать ничего о других технологиях, однако управление сообщениями - это не технология. Для ms A не важно, как ms B сгенерировала события, но важно, что сгенерировало события. - person Constantin Galbenu; 01.10.2018
comment
Моя цель - получить хорошую абстракцию уровня персистентности моего микросервиса. Но проблема, которую я обнаружил, заключается в том, публиковать ли в брокере сообщений перед прослушиванием события брокера, чтобы сохранить их в хранилище событий, или вместо этого записывать событие непосредственно на ES и использовать некоторые функции уведомления, предлагаемые ES, чтобы получать уведомления от изменения. В первом варианте я не могу добиться согласованности, а во втором я не могу гарантировать, что разные технологии ES и ms не знают друг о друге ... - person Christian Paesante; 01.10.2018
comment
@ChristianPaesante обязательно напиши первым в магазин событий. Вы можете абстрагироваться от него, используя интерфейсы. - person Constantin Galbenu; 01.10.2018

Как правило: в сервисных архитектурах, включающих микросервисы, каждый сервис отслеживает свое состояние в частной базе данных.

«Частный» здесь в первую очередь означает, что никаким другим службам не разрешено писать или читать из него. Это может означать, что каждая служба имеет собственный выделенный сервер базы данных или службы могут совместно использовать одно устройство, но иметь права доступа только для своей части.

Другими словами: службы общаются друг с другом, обмениваясь информацией через общедоступный API, не путем записи сообщений в базы данных друг друга.

Для служб, использующих источник событий, каждая служба будет иметь доступ для чтения и записи только к своим потокам. Если эти потоки хранятся в одном доме - хорошо; но правильность системы не должна зависеть от того, что разные службы хранят свои события на одном и том же устройстве.

person VoiceOfUnreason    schedule 27.09.2018

TL; DR: все эти шаблоны применяются к единственному ограниченному контексту (сервису, если хотите), не распространяйте события домена за пределы вашего ограниченного контекста, не публикуйте события интеграции на ESB (корпоративную служебную шину) или что-то подобное, как общедоступный интерфейс.

Итак, у нас есть три шаблона, которые мы кратко рассмотрим индивидуально, а затем вместе.

  1. Микросервисы
  2. CQRS
  3. Поиск событий

Микросервисы

https://docs.microsoft.com/en-us/azure/architecture/microservices/ Основная цель: изолировать и отделить изменения в системе от отдельных сервисов, обеспечивая независимое развертывание и тестирование без побочного воздействия. Это достигается за счет инкапсуляции изменений за общедоступным API и ограничения зависимостей времени выполнения между сервисами.

CQRS

https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs Основная цель: изолировать и отделить проблемы записи от проблем чтения в единой службе. Этого можно добиться несколькими способами, но основная идея состоит в том, что модель чтения - это проекция модели записи, оптимизированной для запросов.

Источник событий

https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing Основная цель: использовать правила бизнес-домена в качестве модели данных. Это достигается путем моделирования состояния как потока неизменяемых событий домена только для добавления и восстановления текущего агрегированного состояния путем воспроизведения потока с самого начала.

Все вместе

Здесь много отличного контента https://docs.microsoft.com/en-us/previous-versions/msp-np/jj554200(v=pandp.10) У каждого из них есть свои сложности, компромиссы и проблемы. Веселое упражнение, которое стоит подумать, если стоимость превосходит выгоду. Все они применяются в рамках одной услуги или ограниченного контекста. Как только вы начнете разделять хранилище данных между службами, вы откроете для себя проблемы, поскольку общее хранилище данных не может быть изменено изолированно, поскольку теперь это общедоступный интерфейс.

Скорее попробуйте опубликовать интеграционные события в общую шину в качестве общедоступного интерфейса для других служб и ограниченных контекстов, которые можно использовать и использовать для построения проекций данных контекстов других доменов.

Рекомендуется публиковать события интеграции как идемпотентные снимки текущего агрегированного состояния (добавить X, удалить X), особенно если ваша шина не является постоянной. Это позволяет при необходимости повторно публиковать события интеграции из домена, не создавая противоречивого состояния между потребителями.

person Matthew.Lothian    schedule 17.03.2021