Rest 如何在ddd中从另一个有界上下文检索数据?

Rest 如何在ddd中从另一个有界上下文检索数据?,rest,architecture,domain-driven-design,microservices,cqrs,Rest,Architecture,Domain Driven Design,Microservices,Cqrs,最初,有一个应用程序运行在桌面上,但是,该应用程序将在未来的web平台上运行 应用程序中存在一些有界上下文,其中一些上下文需要从另一个上下文检索数据。在这种情况下,我不知道在这种情况下我必须使用哪种方法 我考虑使用中介模式,即绑定上下文“a”请求数据“X”,然后中介调用另一个绑定上下文,如B”,并获得正确的数据“X”。最后,中介将数据“X”带到BC“A” 当应用程序在web上运行时,这种情况将发生变化,然后我考虑使用微服务,也使用meaditor模式从另一个微服务请求数据 这两种方法都是有趣的还

最初,有一个应用程序运行在桌面上,但是,该应用程序将在未来的web平台上运行

应用程序中存在一些有界上下文,其中一些上下文需要从另一个上下文检索数据。在这种情况下,我不知道在这种情况下我必须使用哪种方法

我考虑使用中介模式,即绑定上下文“a”请求数据“X”,然后中介调用另一个绑定上下文,如B”,并获得正确的数据“X”。最后,中介将数据“X”带到BC“A”

当应用程序在web上运行时,这种情况将发生变化,然后我考虑使用微服务,也使用meaditor模式从另一个微服务请求数据

这两种方法都是有趣的还是有更好的解决方案

有人能帮我吗


非常感谢

如果您正在通过DB或API调用从其他有界上下文检索数据,您的体系结构可能会陷入死星模式,因为它将不必要的耦合和知识引入客户端上下文

更好的方法可能是将事件驱动机制(如Webhook或消息队列)视为向订阅上下文发送您想要共享的数据的一种方式。这很好,因为它通过跨上下文的数据复制减少了有界上下文的耦合,从而提高了有界上下文的独立性


这让您感觉到“如果有界上下文B不可用,谁会在乎有界上下文A和C中是否有他们需要的数据,我可以稍后恢复同步,因为我的数据更新相关事件记录在我的队列中”

您需要的是用于集成的ddd模式。BC“B”在上游,“A”在下游。您可以在上游进行OHS PL,在下游进行ACL。实际上,这是一个RESTAPI上游和一个适配器下游。每次A需要B的数据时,适配器都会调用RESTAPI并调整返回给域模型的信息。这将是同步。如果您想进行异步集成,B将向MQ发布事件并提供信息,A将侦听这些事件并获取信息。

此问题的答案分为两个不同的方面:

  • 在不同的上下文之间进行通信的逻辑挑战,相同的数据可以以非常不同的方式使用。一个上下文如何解释数据的含义
  • 以及在独立系统之间同步数据的技术挑战。当两个系统都有“相同”数据的独立副本时,我们如何保证每个系统行为的正确性
从逻辑上讲,上下文映射用于定义需要以任何方式进行通信(共享数据)的任何有界上下文之间的关系。控制数据的域模型只适用于单个有界上下文,因此需要一些方法来解释来自另一个上下文的数据。这就是Evan书中的模式发挥作用的地方:客户/供应商、墨守成规者、公开语言、开放主机、反腐败层,或者(逃避模式)单独的方式

在服务之间使用中介可以看作是的实现:服务不需要使用相同的语言,因为它们之间有一个独立的缓冲区来进行翻译。在微服务体系结构中,这可能是两个非常不同的上下文之间的某种集成服务

从技术角度来看,在不同的有界上下文中,服务之间的直接API调用会在这些服务之间引入依赖关系,因此,像Allan提到的那样的事件驱动方法是首选的,假设您的应用程序可以接受这一点(数据的最终一致性)。选择一个能够保证数据同步的消息传递平台非常重要。大多数异步消息传递协议保证“至少一次”传递,但消息的顺序和重复数据消除取决于应用程序

有时,使用同步API调用更简单,特别是当您发现自己在执行大量请求/响应类型的消息传递时(如果您让服务相互发送命令类型的消息,则可能会发生这种情况)


复合UI是另一种模式,它允许您在表示层中进行数据集成,方法是让每个组件从相关服务中提取数据,然后在UI中共享/组合数据。这比后端复杂的跨服务API调用更容易管理,特别是如果您使用IT/Ops服务、NGINX或MuleSoft的Experience API方法来实现“前端后端”(backend for frontend)。

我想添加一条关于DDD中分析的评论。存在几种将数据发送到分析服务器的方法。 1) 如果您有一个大型企业应用程序,并且您应该从所有受限上下文收集大量统计信息,那么最好将分析移动到单独的服务中,并使用消息队列将数据发送到该服务中。
2) 如果您有一个简单的应用程序,请在其他上下文中将您的分析与应用程序分离,并使用事件或命令与之对话

可能是Hi Allan的复制品!我理解你。我不知道如何看到事件可以适合我的场景,发布者和订阅者也一样。系统有三个不同的有界上下文,包括“导入器”、“数据管理”和“分析器”。导入程序负责读取文件数据并将这些数据传递给数据管理。分析仪负责从数据管理中获取数据并执行不同类型的分析。我不知道如何使用事件或发布/订阅服务器来解决这个问题,因为分析器必须获取一些数据,这并不完全取决于用户的选择。用户可以执行用户想要的不同分析。在这种情况下,用户可以从数据管理上下文和dat中选择特定的分析和数据