2016-09-30 167 views
1

2个有界上下文之间是否可以有上行通信被认为是一个坏主意?上下文映射关系

示例,BC为了将发布事件和库存BC将认购该事件,并在同一时间,库存BC可以发布事件和BC为了将认购

+0

有关于这个问题的一些伟大的影片为什么不直接从公元前为了沟通,BC库存和限制发布/订阅机制,从库存反馈订购?这样,库存不依赖于订单。 –

+0

@MarkusPscheidt如果他们直接通过休息调用进行通信,是不是认为是反模式和同步通信?订单应该能够完成它的工作,无论库存是否可用,或者它们应该是相同的MS – Robert

+0

这些问题听起来对我来说似乎颇为技术性问题。即使发布/订阅也不能保证收到发布的消息。您可以使用需要由库存处理的事件队列,保存在订单数据库中,直到REST调用库存为止。在库存方面的处理可以通过发布/订阅与订单的反馈异步完成。 –

回答

1

不是这是不是一个坏主意,其实这是一个好主意,让我解释一下。

首先考虑您的限界上下文,在现实中,他们竟然一无所知对方,即使多个Contexts正在共同创造一个完整的解决方案,所有的上下文knows的是用户本身,OWN担忧。

拿一个OnboardingContext负责当一个新员工开始在一家公司,这里一个Employee实体首次添加到系统中。这里的员工有姓名,电话号码,开始日期,地址,婚姻状况等等。

考虑PayrollContext,它也有一个Employee实体,但这里所有这些实体是一个ID,工资,开始日期和结束日期 - 在这里它不关心的地址,或婚姻状况,这不是” t甚至不一定关心名称,因为这个上下文名称并不重要,只有工资,开始日期和结束日期。

因此,如果两种情况下,不应该彼此了解,但也许关心一些有关这两方面的信息,我们如何得到一个新的Employee已开始并需要支付的事实?

域事件

域事件中使用分布式系统。当然,模型将变得更加复杂,但也更具可扩展性。域事件在一个event driven architecture

使用继承人它如何工作

  1. 一个新员工开始,并添加到系统中OnboardingContext,一切都是正确的,该模型是成功的坚持。
  2. OnboardingContext引发一个事件,就其而言是做该事件被称为NewEmployeeEvent

这就是它的OnboardingContext。它处理了新员工,保存了它,并且提出了一个非常漂亮的系统事件来说明发生了某件事(事件)。

我们的PayrollContext

  1. PayrollContext有兴趣一对夫妇的事情,特别是要对了解一个新emplyee启动时。
  2. 它签约的NewEmployeeEvent这个事件是一个普通型的,它不知道该事件源于,事实上它可能来自任何地方,但它感兴趣的数据的小袋子,或者在inormation事件。
  3. 当事件引发此背景下handles这种情况下,在这种情况下,抓住有关薪酬与员工编号相关的信息,它坚持这给它自己的数据存储区中的工资以后使用。

景气完成。

您的系统现在将监听并响应事件,这些事件会在整个系统中以任意方向流向各个方向。

当利益发生事情和事件引发的,任何人(上下文)感兴趣的是事件订阅,把手和做的事情要提供关于该事件的数据的。

那么你如何做到这一点?

有很多的阅读做的,只是谷歌DDD和域事件。

你会遇到很多从吉米博加德文章(a better domain events pattern)和乌迪大寒(Domain Events Salvation)关于这个问题

看看nservicebus(支付)和masstransit(开放源代码),他们是太棒了盒子事件和消息传递系统。

Nservice总线在https://docs.particular.net/nservicebus/architecture/principles

1

是的,这是一个坏主意。

您的设计会导致两个BC之间的循环依赖关系。正如软件开发的许多其他领域一样,循环依赖几乎总是一个坏主意

如果你的用例迫使你这样做,那么你应该重新考虑你的上下文映射。问自己以下问题:

  • 两个BC真的是单独的BC,还是他们应该是一个BC?
  • 还是应该导致循环依赖的BC之一的一部分事实上在公元前三?

找到这些问题的答案在您的域的上下文可能会带你到一个更清洁的设计。

+0

假设我们有订单BC和付款处理BC。订单创建时,会发布事件。然后将事件缓存起来并通过支付处理微服务/有限上下文进行处理。如果处理成功,那么该订单需要在第一个BC中标记为已完成。你想说,我应该有第三个微服务/ BC,然后将所有订单与他们的状态,如订单历史BC存储? – Robert

+0

这个具体的例子听起来更像是“把所有东西都放在一个BC中”的方法。但它真的取决于你的域名的样子,所以我不能给你“正确”的答案。 – theDmi

+0

当您与另一个需要从他们接收数据并向他们发送数据的系统集成时,您有某种使用事件进行双向通信的客户 - 供应商。我总是担心在埃里克埃文斯会说的“好,这取决于”的事情上,会有很多人说_NO,不这样做。 –