微服务:如何建模相关领域对象?

microservices: How to model related domain objects?

我有 2 个域对象:项目和合同。一个项目可以有很多合同,因此在数据库中它被建模为典型的一对多关系。我们的问题是:如何在微服务的上下文中对上述内容进行建模?你 (a) 有 2 个微服务 ProjectService 和 ContractService 吗?或 (b) 您是否有一个包含项目和合同的项目服务?

我们认为答案 (a)(即 2 个微服务 ProjectService 和 ContractService)意味着必须调用 2 个服务来检索和保存完整的 Project 对象层次结构。另一方面,答案 (a) 将项目与合同完全分离,这在理论上可能是一件好事,但实际上没有用,因为没有项目,合同在逻辑上就不可能存在。

这里正确的做法是什么?答案 (a) 是 nano 服务反模式的一个例子吗?

这取决于 "project" 和 "contract" 域的复杂程度。通过回答以下问题,希望您能够做出正确的决定:

  1. 隔离变更的观点:您认为一个领域的需求变更是独立的还是比另一个领域更频繁?
  2. 团队设置观点:您希望 separate/multiple 团队实现这些功能吗?他们是否能够在不了解另一个团队领域的情况下独立工作?
  3. 技术角度:您是否期望使用不同技术更有效地实施项目和合同领域?
  4. 数据一致性视角:你能接受项目和合同的最终一致性吗?
  5. 非功能需求角度:这些服务的性能和可用性需求是否不同?
  6. 技术风险视角:您的团队内部是否已经具备分布式系统和必要的专业知识?
  7. 内聚角度:尝试对服务建模,其中一个在运行时是否完全独立于另一个?相互依赖是高内聚和不同服务候选者的标志
  8. 服务客户视角:这些服务会有不同的客户吗?它们都会被其他服务访问吗?

如果几乎所有问题的答案都是 "yes",那么继续进行 2 个微服务。我认为很可能不是。