CRM微服务架构实现HRM及Domain设计问题
Microservice architecture implementation of CRM HRM and Domain design problems
我们正在构建一个由CRM、HRM、SALE、属性等组成的企业平台。
我们正在研究微服务架构。
真正的问题是:
CRM 和 HRM 将作为单独的独立微服务部署,但通常这两个微服务需要相互通信。 HRM 用户创建公司联系人员工,HRM 微服务 API 将 HRM 模块内与 HRM 相关的信息保存在 'hrm' 数据库中,而姓名、地址等员工详细信息将保存到 CRM 数据库调用 CRM 微服务 API,即联系人 API 将上述信息保存为 'Internal' 或 'Employee' 类型的联系人。
所以基本上我在这里要做的是分离与每个微服务相关的数据。
这种域设计方式是否正确? 还是我必须在 HRM 模块中处理和存储所有信息(由 HRM 许可用户输入)和 'hrm' 数据库?这样我们就不会关心 CRM。如果是这样,CRM 似乎只管理外部联系人?以后会不会有什么问题?
这里有几件事:
1) CRM 和 HRM 不是微服务。这些域没有任何微观。
2) 通常,您希望服务之间的耦合尽可能少。这并不意味着您不能使用组合模式,但您应该考虑在任何给定情况下为什么要使用它们。如果您只是为了避免代码重复或数据库重复而这样做,您真的应该对此持怀疑态度。
您希望通过将员工放入 CRM 数据库来完成什么?只是您在 CRM 中已经有了 "person" domain/database 吗?如果是这样,那么您将员工保留在 CRM 中的理由就非常站不住脚了。另一方面,如果您的目标是将员工视为客户,并在内部向他们推销,那么将员工置于 CRM 中可能很有价值。
我真的建议您考虑将它们设计为单独的商店。它将允许这些系统独立发展、独立扩展等。
如果您真的希望所有联系人都在一个系统中,请考虑一种新服务(可能更多 "micro"),它可以存储和检索联系人。这可以被两个服务使用,但将独立于每个服务。
我不确定你的问题与 DDD 有什么关系,也不确定你有多想拥抱 DDD,但它具有无处不在的语言这一重要概念。该语言包含非常精确和明确的领域术语,这些领域术语在领域专家口中、所有模型中以及最终在代码中必须相同。
联系人就是联系人。雇员就是雇员。他们有不同的名字是有原因的。它们反映了不同的领域概念。
除非联系人可以以某种方式证明也是员工(只有您所在领域的专家才能知道,当然不是 Whosebug 上的人),他们没有理由分享任何东西 - 无论是数据库 table、基础 class 等,如果它们在不同的限界上下文中则更是如此。
我们正在构建一个由CRM、HRM、SALE、属性等组成的企业平台。 我们正在研究微服务架构。
真正的问题是: CRM 和 HRM 将作为单独的独立微服务部署,但通常这两个微服务需要相互通信。 HRM 用户创建公司联系人员工,HRM 微服务 API 将 HRM 模块内与 HRM 相关的信息保存在 'hrm' 数据库中,而姓名、地址等员工详细信息将保存到 CRM 数据库调用 CRM 微服务 API,即联系人 API 将上述信息保存为 'Internal' 或 'Employee' 类型的联系人。 所以基本上我在这里要做的是分离与每个微服务相关的数据。
这种域设计方式是否正确? 还是我必须在 HRM 模块中处理和存储所有信息(由 HRM 许可用户输入)和 'hrm' 数据库?这样我们就不会关心 CRM。如果是这样,CRM 似乎只管理外部联系人?以后会不会有什么问题?
这里有几件事:
1) CRM 和 HRM 不是微服务。这些域没有任何微观。
2) 通常,您希望服务之间的耦合尽可能少。这并不意味着您不能使用组合模式,但您应该考虑在任何给定情况下为什么要使用它们。如果您只是为了避免代码重复或数据库重复而这样做,您真的应该对此持怀疑态度。
您希望通过将员工放入 CRM 数据库来完成什么?只是您在 CRM 中已经有了 "person" domain/database 吗?如果是这样,那么您将员工保留在 CRM 中的理由就非常站不住脚了。另一方面,如果您的目标是将员工视为客户,并在内部向他们推销,那么将员工置于 CRM 中可能很有价值。
我真的建议您考虑将它们设计为单独的商店。它将允许这些系统独立发展、独立扩展等。
如果您真的希望所有联系人都在一个系统中,请考虑一种新服务(可能更多 "micro"),它可以存储和检索联系人。这可以被两个服务使用,但将独立于每个服务。
我不确定你的问题与 DDD 有什么关系,也不确定你有多想拥抱 DDD,但它具有无处不在的语言这一重要概念。该语言包含非常精确和明确的领域术语,这些领域术语在领域专家口中、所有模型中以及最终在代码中必须相同。
联系人就是联系人。雇员就是雇员。他们有不同的名字是有原因的。它们反映了不同的领域概念。
除非联系人可以以某种方式证明也是员工(只有您所在领域的专家才能知道,当然不是 Whosebug 上的人),他们没有理由分享任何东西 - 无论是数据库 table、基础 class 等,如果它们在不同的限界上下文中则更是如此。