【问题标题】:Seeding a subscribers data when it comes online after a publisher在发布者上线后播种订阅者数据
【发布时间】:2013-01-09 01:25:31
【问题描述】:

假设我们有两个业务组件

  1. 用户管理

这拥有用户。当用户信息发生变化时,该组件会发布消息。例如“NewUserCreated”

  1. 出版物

处理与用户的通信。电子邮件、推文等。因此,订阅用户消息的该组件将这些信息的子集存储在其自己的存储中。

问题

如果用户管理组件在发布组件之前上线会发生什么? Publications 如何获取现有用户的列表?它不应该知道用户管理组件如何存储其数据。

【问题讨论】:

  • 为什么需要用户列表?如果发布服务先上来,它如何获取用户列表?
  • 这确实是个问题。初始同步是如何执行的?
  • 只要您有可用的订阅,这并不重要。您还可以手动将订阅添加到消息的订阅数据库中

标签: distributed-computing messaging nservicebus event-sourcing


【解决方案1】:

我不确定用户管理和发布是 BC,而是不同的服务或 AC,因为它们服务于不同的业务功能,而不是实体的两个子集。

在发布服务中存储用户实体的子集可能是一种服务气味。两个服务之间不应该有任何数据重复,除了关联 ID (userId)。

发布服务不需要所有用户的列表:

如果您谈论的是维护或版本更新等较短的服务器停机时间,则从 UserManagement 服务发送的消息将在传出队列(或配置的超时后的错误队列)中可用,并且可以重新发送到发布服务。以前的数据应该在 Publications 数据存储中。

让我们考虑另一种情况 - 假设您的系统已经运行了一年,而您一直在收集用户信息,但没有发布服务中的功能。现在,在您拥有数百万用户之后,您可以添加新的发布服务。

最初,那里不会有数据。当系统的当前用户登录时 - 他可能会看到一个新页面,他应该在其中填写他的发布详细信息(电子邮件、推特、脸书帐户等),这将导致发布服务数据中出现一个新条目(带有相关的用户身份)。新用户将在登录时将数据添加到发布服务数据存储(如果您要求他们这样做)。

这有帮助吗?

【讨论】:

    【解决方案2】:

    与任何集成项目一样,我只会选择 ETL 程序,以便在新系统启动之前获取您需要的相关数据。

    这是一次性的事情,所以没有必要使事情复杂化:)

    【讨论】:

      【解决方案3】:

      正如 moranlf 所说,用户管理和发布似乎是两种不同的服务。 两者之间不应有数据重复。

      Publications 就像著名的亚马逊类比中的 Shipping Service:它保存有关用户实体(地址)的数据,但只有它自己的/它负责的那个(appart 来自 userId,这对两者都是通用的)他们)。从用户管理服务发布的任何事件都不会将数据“创建”到订阅服务中。它可能会启动一个策略/传奇,触发一个处理程序,但仅此而已。

      这里有两种情况:

      • 您已将订阅存储在数据存储中,并且您正尝试将职责拆分为两个独立的服务。由于 Publications 服务只保存自己的数据,因此它只是将数据从一个表/持久性存储移动到另一个。无需重播或生成事件。
      • 您没有订阅:在这种情况下无需执行任何操作,因为它会在用户采取行动时存储其数据。

      这有帮助吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多