在分布式架构中使用 DDD 聚合服务?
Use of DDD Aggregate Services in a distributed architecture?
假设我的大学申请有 2 个限界上下文:Students 和 Lecturers.
在我的系统后端,我有一个学生 Api 和讲师 Api 作为分布式应用程序。这些应用程序中的每一个都在内部采用洋葱架构:
- 表示层(Http request/response 处理)
- 应用层
- 领域层(即 Student entities/aggregates 等 Student Api)
现在,对于我的平台前端,我使用客户端应用程序(即 React)来调用我的 Api 网关。这非常有效,因为存在门户的学生部分和门户的讲师部分,这意味着大多数时候页面使用一个限界上下文或另一个的 Api 结果来支持。
但是门户网站的一些页面需要来自两个 限界上下文的数据,例如打印讲师课程中的所有学生。
我可以让客户端应用程序发送多个请求,从两个域中检索并将结果拼凑在一起,但如果他们只需要发送一个返回页面所有数据的请求,那就更好了。
因此,让另一个分布式 'aggregate' 应用程序位于我的域 API 之上来管理(和缓存)这种数据编排是否是一种常见的实现方式?如果是这样,这样一个应用程序的名称是什么,因为它现在是必不可少的 另一个 'higher level' Onion Architecture around my original domain APIs:
- 表示层(客户端应用程序)
- 应用程序层(一个整合来自学生 Api 和讲师 Api 的数据的聚合应用程序)
- 领域层(2 个限界上下文 Api 本身,在内部实现了自己的洋葱架构)
在这种情况下,我会建议对 Course 聚合进行建模(它甚至可能是它自己的限界上下文;我可能甚至不一定要 Students 和 讲师 他们自己的限界上下文,但这并不是真的在这里或那里)与学生和讲师。然后,这个聚合可以以 CQRS 方式维护自己对学生和讲师信息的看法(例如,通过订阅来自学生和讲师限界上下文的事件流),并且只关心它需要关心的信息。然后你的客户只需要一门课程就可以得到学生的名字。
这样做的一个好处是,即使支持其他聚合的服务不可用,此查询也可以 运行;当然,为此付出的代价是最终一致性。
假设我的大学申请有 2 个限界上下文:Students 和 Lecturers.
在我的系统后端,我有一个学生 Api 和讲师 Api 作为分布式应用程序。这些应用程序中的每一个都在内部采用洋葱架构:
- 表示层(Http request/response 处理)
- 应用层
- 领域层(即 Student entities/aggregates 等 Student Api)
现在,对于我的平台前端,我使用客户端应用程序(即 React)来调用我的 Api 网关。这非常有效,因为存在门户的学生部分和门户的讲师部分,这意味着大多数时候页面使用一个限界上下文或另一个的 Api 结果来支持。
但是门户网站的一些页面需要来自两个 限界上下文的数据,例如打印讲师课程中的所有学生。
我可以让客户端应用程序发送多个请求,从两个域中检索并将结果拼凑在一起,但如果他们只需要发送一个返回页面所有数据的请求,那就更好了。
因此,让另一个分布式 'aggregate' 应用程序位于我的域 API 之上来管理(和缓存)这种数据编排是否是一种常见的实现方式?如果是这样,这样一个应用程序的名称是什么,因为它现在是必不可少的 另一个 'higher level' Onion Architecture around my original domain APIs:
- 表示层(客户端应用程序)
- 应用程序层(一个整合来自学生 Api 和讲师 Api 的数据的聚合应用程序)
- 领域层(2 个限界上下文 Api 本身,在内部实现了自己的洋葱架构)
在这种情况下,我会建议对 Course 聚合进行建模(它甚至可能是它自己的限界上下文;我可能甚至不一定要 Students 和 讲师 他们自己的限界上下文,但这并不是真的在这里或那里)与学生和讲师。然后,这个聚合可以以 CQRS 方式维护自己对学生和讲师信息的看法(例如,通过订阅来自学生和讲师限界上下文的事件流),并且只关心它需要关心的信息。然后你的客户只需要一门课程就可以得到学生的名字。
这样做的一个好处是,即使支持其他聚合的服务不可用,此查询也可以 运行;当然,为此付出的代价是最终一致性。