Существуют ли рекомендации по определению очередей RabbitMQ для ограниченного контекста в DDD? - PullRequest
1 голос
/ 18 мая 2019

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

Такие вещи, как одна очередь на ограниченный контекст или одна очередь на тип ресурса в ограниченном контексте.

И поскольку очереди обычно пересекают различные ограниченные контексты, это усложняет задачу.

Какой совет?

Ответы [ 3 ]

1 голос
/ 19 мая 2019

Есть 2 основных «беспокойства» (слоя), которые я склонен использовать.

Для любой программной системы разумного размера я бы использовал очередь на ограниченный контекст, который касается только команд от рассматриваемого BC.Конечная точка, обрабатывающая сообщения, будет названа в виде строки System.BoundedContextA.Server, и эта конечная точка будет обрабатывать только команды из BoundedContextA.

Для любой оркестровки, "принадлежащей" BoundedContextA, у меня была бы другая конечная точка / очередь, обрабатывающая события, относящиеся к оркестровке.Эта конечная точка обрабатывает не только сообщения, относящиеся к BoundedContextA, но также сообщения от других BC, которые могут быть связаны с оркестровкой.Эта конечная точка будет именоваться по линиям System.BoundedContextA.Orchestration.

Конечные точки можно масштабировать по горизонтали, и это особенно легко при использовании RabbitMQ.

1 голос
/ 20 мая 2019

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

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

Даже в этом случае DDD также не предписывает особый подход к интеграции;Тот факт, что вы спрашиваете об очередях, указывает на то, что вы рассматриваете Асинхронная интеграция .В этом нет ничего плохого, но это всегда окупается решениями архитектуры deffer .Особенно, если вы «собираетесь» открыть этот домен через DDD.Попробуйте начать с простого , слабо связанного, но сначала монолита , вы можете обнаружить, что вам вообще не нужны очереди.

Учитывая все вышеизложенное, в сценарии асинхронной интеграции с RabbitMQ принято использовать шаблон pub-sub .Все соответствующие события публикуются на один обмен без учета конкретного потребителя.Потребители устанавливают свои собственные очереди и привязки так, как им требуется, поэтому не существует единой формулы, которая работает:

  • Одна очередь на тип события на одного потребителя
  • Одна очередь на потребителя с несколькими привязкамидля типов событий или шаблонов тем
  • Очереди, общие для пользовательских экземпляров для балансировки нагрузки
  • ... и многие их комбинации.
0 голосов
/ 18 мая 2019

Для каждого типа потребителя требуется одна очередь.

Рассмотрим тип потребителя C1, который обрабатывает события типа E1 и E2.Требуется очередь Q1, в которую направляются все события типа E1 и E2.Если другой тип потребителя C2 обрабатывает события типа E3 и E4, требуется очередь Q2, в которую маршрутизируются все события типа E3 и E4.

...