微服务和限界上下文
microservices and bounded contexts
为了提问,假设我有 2 个微服务。
- 身份管理
- 会计
我知道每个微服务不应该紧耦合,它应该有自己的数据库。
假设会计有发票,每张发票都有开具代理。
来自会计的代理人也作为用户存在于身份微服务中。
如果我理解得很好,来自身份管理(用户)的数据应该复制到会计(代理),并且应该只复制该限界上下文(名字和姓氏)所需的数据,因此发票可以有适当的 issuingAgentId
.
这是保持数据一致并在上下文之间共享的正确方法吗?
每次在身份微服务中创建用户时,都会发布事件 "UserCreated" 并且会计或任何其他对此事件感兴趣的服务是否应该通过添加相应的代理来监听和处理它?
更新用户信息也是如此。
是的,这是一种处理方法,通常是首选方法。您在服务中本地保留一个缓存,用于保存来自其他服务的数据副本。在事件驱动系统中,这将涉及监听感兴趣的事件并使用它们来更新本地缓存。缓存可以在内存中,也可以持久化。您的用例的一个示例是在开具发票时,会计上下文会在创建发票之前在其本地缓存中查找 user/agentid。
其他选项:
共享数据库
我知道它不受欢迎(有充分的理由),但您始终可以共享数据库架构。例如,Identity 上下文可以写入用户 table,而 Accounting 上下文可以在需要 AgentId 放入发票时从中读取。权衡是你在数据库级别耦合,并引入单点故障。
RPC
您可以在需要信息时对其他服务进行 RPC 调用。在您的示例中,会计上下文会在开具发票之前调用身份管理上下文以获取 AgentId/User 信息。这种方法的权衡又是与其他服务的耦合。当它不可用时你会做什么?您无法开具发票。
报告域
另一种选择是拥有一个完全独立的服务来侦听来自其他服务的数据并维护 UI 的视图模型。这将使您的其他服务不知道其他服务的问题。使用事件驱动系统时,您会监听来自其他服务的事件,这些服务允许您为 UI 构建视图模型。如果您所做的只是查看数据,这通常是一个不错的选择
为了提问,假设我有 2 个微服务。
- 身份管理
- 会计
我知道每个微服务不应该紧耦合,它应该有自己的数据库。
假设会计有发票,每张发票都有开具代理。 来自会计的代理人也作为用户存在于身份微服务中。
如果我理解得很好,来自身份管理(用户)的数据应该复制到会计(代理),并且应该只复制该限界上下文(名字和姓氏)所需的数据,因此发票可以有适当的 issuingAgentId
.
这是保持数据一致并在上下文之间共享的正确方法吗? 每次在身份微服务中创建用户时,都会发布事件 "UserCreated" 并且会计或任何其他对此事件感兴趣的服务是否应该通过添加相应的代理来监听和处理它? 更新用户信息也是如此。
是的,这是一种处理方法,通常是首选方法。您在服务中本地保留一个缓存,用于保存来自其他服务的数据副本。在事件驱动系统中,这将涉及监听感兴趣的事件并使用它们来更新本地缓存。缓存可以在内存中,也可以持久化。您的用例的一个示例是在开具发票时,会计上下文会在创建发票之前在其本地缓存中查找 user/agentid。
其他选项:
共享数据库
我知道它不受欢迎(有充分的理由),但您始终可以共享数据库架构。例如,Identity 上下文可以写入用户 table,而 Accounting 上下文可以在需要 AgentId 放入发票时从中读取。权衡是你在数据库级别耦合,并引入单点故障。
RPC
您可以在需要信息时对其他服务进行 RPC 调用。在您的示例中,会计上下文会在开具发票之前调用身份管理上下文以获取 AgentId/User 信息。这种方法的权衡又是与其他服务的耦合。当它不可用时你会做什么?您无法开具发票。
报告域
另一种选择是拥有一个完全独立的服务来侦听来自其他服务的数据并维护 UI 的视图模型。这将使您的其他服务不知道其他服务的问题。使用事件驱动系统时,您会监听来自其他服务的事件,这些服务允许您为 UI 构建视图模型。如果您所做的只是查看数据,这通常是一个不错的选择