【问题标题】:How to design a pub-sub system where there can be multiple publisher for same entity?如何设计一个发布订阅系统,其中同一实体可以有多个发布者?
【发布时间】:2019-09-14 17:49:39
【问题描述】:

考虑以下情况:

  1. 有一个 User 表,其中包含姓名、电子邮件、contact_no 等字段。
  2. 我们有多个产品/系统(带有自己的数据库),它们将用户信息用于各种目的。
  3. 这些系统通过发布-订阅模式保持同步,例如:系统 1 更改名称由系统 2 使用并在系统 2 中进行更改。
  4. 为简单起见,我们假设有 3 个系统:
    • S1 为用户提供 UI。在这里用户可以自己更改他的信息。
    • 给销售人员的 S2 系统。用户可以在此处致电销售人员并更新他们的信息。
    • S3 另一种产品,它使用来自 S1 和 S2 的信息进行各种计算。

所以信息可以从 S1 和 S2 发布。

假设用户最初的名字是 N1。

  • 在时间 t1,用户将名称从 N1 更新为 N2。
  • 在时间 t1,销售人员将姓名从 N1 更新为 N3。

  • 现在 S1 使用来自 S3 的事件并将名称更新为 N3。 S2 使用来自 S1 的事件并将名称更新为 N2。

  • 在 S3 中,名称可以是任何 N2 或 N3,具体取决于首先使用哪个事件。

这造成了各个系统之间的大量数据一致性。

在理想的系统中只有一个发布者,但由于要求我们必须从销售面板添加发布事件。可以做些什么来最大程度地减少数据不一致?

【问题讨论】:

  • S3 是发布者还是消费者,还是两者兼而有之?声明“信息可以从 S1 和 S2 发布”似乎与“S1 从 S3 消费事件”相冲突。

标签: design-patterns architecture publish-subscribe software-design distributed-system


【解决方案1】:

问题似乎在于决定谁是用户数据的主人,因为现在 S3 正在尝试为两个主人服务。

S1 --> S3
S2 --> S3

让我们让 S1 成为用户数据的主控,以便任何其他接受该数据的系统(例如 S2)只负责更新主控。通过这种方式,S3 从单一来源(用户数据的主人)获取用户数据。

       S1 --> S3
S2 --> S1 --> S3

master 负责消费和生产它拥有的数据。另一个系统可能会使用(甚至存储)相同的数据,但它只能生产给主系统。除了数据的主控系统之外,任何系统都不能生成它不拥有的数据。

只要只有一个系统,哪个系统是主系统并不重要。有多少系统存储数据的副本并不重要,只要只有一个主服务器。让每个系统主控一种类型的数据可能比单个主控管理所有数据更具可扩展性。

【讨论】:

    【解决方案2】:

    让我再说一遍..

    1. 您有多个附加了独立数据库的系统。
    2. 用户可以从任何系统更改数据
    3. 用户应该会看到从任何系统更改的数据。

    在这种情况下,我将使用 Master DB / System,它将成为每个系统的单点数据源。

    如果任何系统想要更改数据,那么数据首先需要在主数据库/系统上更新,然后它应该传播到其他系统以反映更改。

    对于 Pub-Sub,我将遵循 Fan-IN 和 Fan-out 的方法。

    1. 每个系统都将充当不同主题/频道的发布者和消费者。
    2. 发布者(在 S1-SN 上)会将更改推送到一个主题/频道以进行类似的数据更改
    3. 主数据库系统将监听主题/频道以获取来自其他系统的更改请求。它还将充当其他系统的发布者,在处理后将相同的消息推送到不同的主题/频道。
    4. 消费者(在 S1-SN 上)将收听主题/频道以获取由主数据库系统放置的类似数据更改。它将使用该数据来更新自己的系统数据库以进行数据更改。

    通过这种方式可以实现系统之间的数据一致性。唯一需要注意的是这个过程的延迟,如果任何系统出现故障,都可能出现这种情况。

    希望我能回答您的问题。

    【讨论】:

      【解决方案3】:

      维护一张表以跟踪所有最新更新(最新一日更新)。假设所有更新最终都可以在几分钟内通过发布/订阅系统传播到所有其他系统。

      所有系统都应在更新条目之前联系此主要来源(对于姓名、电子邮件和联系电话等字段)

      • 如果该主源表中已经有一个条目,则需要验证 这是最新的。如果他们是较新的条目,则需要提醒用户有 最近的一些更新发生在同一条记录上,你还在吗 想要更新它。

      • 如果没有条目,那么您可以轻松地使用新条目更新数据 数据并在这些主源表中插入一个条目。

      当任何系统通过 pub-sub 处理更新时,只有在同一记录没有发生新更新时它才应该更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-16
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多