Microservices 如何在CQRS读取端管理用户实体/审核数据?

Microservices 如何在CQRS读取端管理用户实体/审核数据?,microservices,cqrs,Microservices,Cqrs,我们有一个非常常见的情况:每个聚合、命令、事件等都包含某种审计日志:这是谁创建的?谁做了最后的修改?什么时候 基本上,每个读取模型也需要包含这些数据,因为客户端需要显示这些信息 为了简单起见,想象一下StackOverflow的问题阅读模型(包括所有相应的答案和评论)。 Read模型包含很多用户:谁创建了这个问题?谁做了最后的修改?同样的数据同样适用于每个评论和答案以及答案的评论 现在考虑一个更大的平台,有更多的阅读模型,基本上每个阅读模型都需要相同的用户信息 我现在遇到了4种不同的解决方案

我们有一个非常常见的情况:每个聚合、命令、事件等都包含某种审计日志:这是谁创建的?谁做了最后的修改?什么时候

基本上,每个读取模型也需要包含这些数据,因为客户端需要显示这些信息


为了简单起见,想象一下StackOverflow的问题阅读模型(包括所有相应的答案和评论)。

Read模型包含很多用户:谁创建了这个问题?谁做了最后的修改?同样的数据同样适用于每个评论和答案以及答案的评论

现在考虑一个更大的平台,有更多的阅读模型,基本上每个阅读模型都需要相同的用户信息


我现在遇到了4种不同的解决方案,但我还不确定该选择哪一种。或许还有更好的

  • 仅在读取模型中存储
    用户ID
    。客户端必须查询
    用户服务
    ,才能获得用户名

  • 自包含微服务(使用事件):每个服务存储用户数据库的一个小副本(仅id、名称)

  • 耦合微服务:对于来自客户端的每个请求,每个服务都将查询
    用户服务
    中的用户名

  • 将整个用户数据库加载到客户机的缓存中,然后使用它

  • 缺点是:

  • 如果无法访问
    用户服务
    ,则客户端无法显示所有必要的信息。此外,客户端必须从响应中提取所有
    用户ID
    ,并向
    用户服务发出单独的请求

  • 收听
    UserCreatedEvent
    s以便将整个用户数据库复制到每个微服务,这是大量重复的代码和数据

  • 与方法1相同的问题:如果无法访问
    用户服务
    ,则无法显示信息。当然,这将引入高耦合,大量的网络流量,等等

  • 这对于我们当前的项目是不可能的,因为有太多的用户,并且可以频繁地添加新用户


  • 到目前为止,方法2在我看来是最好的,因为它应该是最有弹性的。代码复制可以提取到一些
    公共模块
    ,该模块跟踪
    UserCreatedEvent
    ,并提供一些api/回调机制


    你是如何在你的项目中解决这个问题的?你还有其他的优点/缺点吗?

    除了你提到的优点和缺点之外,我还要补充一些要点或问题,你可以在做出决定之前问自己:

  • 如果无法访问用户服务,则客户端无法显示所有必要的信息。此外,客户端必须提取所有 从响应中提取userid,并向用户发出单独的请求 服务
  • 在一段时间内,某些屏幕上的用户信息将不可用,这真的很糟糕吗?如果用户服务关闭,最小的问题之一是某些屏幕没有完整的用户信息。:)另外,客户端提取所有id并进行单独调用也没有那么大问题吗?可能有问题的是您要从中获取的用户ID的数量 用户服务。这完全取决于您正在显示的记录数量和您的用例

  • 为了将整个用户数据库复制到每一个微服务,监听UserCreatedEvents需要大量重复的代码和数据 数据
  • 在这种情况下,它不会将整个用户数据库复制到每个服务。根据您给出的关于堆栈溢出问题/答案的示例,它将是一小部分数据,如:id和userName。某些类型的问题列表将包含所有问题,这些问题的用户名是提问者的用户名。然后,如果有人想查看有关用户的更多信息,他只会在这种情况下调用用户服务。另一方面,并非每个用户都提出问题和/或回答问题。尽管如此,这仍然是一个有效的观点,如果您在所有服务中都这样做,那么会有很多重复。我想说,您不必在所有服务中都使用这种方法。只有那些更适合的地方,以及可能使用更少用户数据的地方,才会被使用

  • 与方法1相同的问题:如果无法访问用户服务,则无法显示信息。当然还有这个 将引入高耦合、大量网络流量等
  • 与1相比,此选项增加了一点。选项与从一个微服务到另一个微服务的本地调用相比,从外部客户端(WebApp、移动app)到某个restapi的调用可能要慢得多。一般来说,即使微服务不在同一台服务器上,它们也可能在同一个集群上,因此从一个服务器到另一个服务器的呼叫将在同一个网络中,因此比来自某个客户端应用程序的呼叫更快。这在大多数情况下并不多,但是如果你有很多电话,那么你也可以考虑。 一般建议

    您应该检查每个微服务如何处理用户数据,并根据这些数据决定复制或调用用户微服务。我会逐案决定。两种方法(选项1或选项2)各有利弊