События домена для синхронизации данных с другими микросервисами - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь узнать больше о DDD и проходил через DomainEvents. Допустим, у нас есть три микросервиса Service A, Service B и Service C.

Service A имеет сущность Foo, определенную следующим образом:

public class Foo : AggregateRoot
{
    public string id {get; private set;}

    public string name {get; private set;}

    public string email {get; private set;}
}

, а Service B - это служба, которая зависит от email от Foo, тогда как Service C зависит от name с Foo, и данные реплицируются с Service A на Service B и на Service C всякий раз, когда происходит изменение значений Foo через Bus.

Рекомендации по событиям в домене, с которыми я столкнулся:

  1. Не передавайте избыточную информацию как часть данных DomainEvent.
  2. Когда consuming BoundedContext знает о Producing BoundedContext, возможно, поделитесь идентификатором, иначе передайте полную информацию
  3. Не используйте DomainClasses для представления данных в событиях
  4. Используйте Primitive types для данных в Events

Теперь вопрос, который возник из-за противоречивых рекомендаций:

Означает ли это, что я должен запускать два разных события, когда они меняются, как FooNameChange и FooEmailChanged и только использовать id вместе с updated value как часть Event Payload?

Или я могу просто сделать один DomainEvent с именем FooChanged, принять состояние сериализации Foo и запустить событие. Затем запишите обработчик как часть того же BoundedContext, который будет принимать данные, и поместите его в Bus для любой службы, подписанной на сообщение, и отдельная служба решит, какие действия предпринять, основываясь на Id, который было прикреплено и событие arg ( обновленные данные ).

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Если вам нужно общаться между службами, вам, возможно, следует искать события интеграции вместо «событий домена» от Microsoft Документы

События домена и события интеграции

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

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

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

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

Какую информацию вы отправляете в процессе интеграции события, это действительно зависит. У вас есть следующие варианты:

  • Publi sh событие, такое как FooNameChanged, FooEmailChanged только с Id из Foo. В этом сценарии, если вашим потребителям нужна дополнительная информация о , что изменилось , им нужно будет позвонить вашей службе (возможно, вызову REST API). Недостаток этого подхода заключается в том, что если у вас много подписчиков на ваше мероприятие, то все эти службы будут вызывать вашу службу, чтобы получить информацию о событии почти одновременно.

  • Publi sh событие с полными данными (обратите внимание, что это не то же самое, что ваш домен), которое может понадобиться потребляющей службе, такой как PerviousValue, CurrentValue, et c. Если ваша полезная нагрузка невелика, это может быть хорошим вариантом. Эти типы событий обычно называют «событиями FAT»

0 голосов
/ 02 апреля 2020

DomainEvents не являются патч-документами.

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

То есть, принадлежат ли два изменения одному и тому же событию или различным событиям, получится большое «это зависит».

...