【问题标题】:High Scalability Question: How to sync data across multiple microservices高扩展性问题:如何跨多个微服务同步数据
【发布时间】:2019-10-25 18:16:39
【问题描述】:

我有以下用例:

  1. 假设您有两个微服务,一个是 AccountManagement 和一个处理事件 U 的 ActivityReporting。
  2. 当用户注册时,包含用户信息的事件U会发布到broker中,供两个微服务处理。
  3. 出于性能和可扩展性的原因,AccountManagement 和 ActivityReporting 微服务在两个实例每个之间进行复制。
  4. 每个微服务实例都有一个消费者监听代理主题。主题的选择是让 AccountManagement 和 ActivityReporting 可以同时处理 U。

但是,我只希望 AccountManagement 的一个实例来处理事件 U,而 ActivityReporting 的一个实例来处理事件 U。

请分享您实施每个应用程序组消费一次的代理系统的经验。

因为这样可以有效地解决这个问题。

【问题讨论】:

    标签: apache-kafka message-queue kafka-consumer-api jms-topic kafka-topic


    【解决方案1】:

    如果您的所有消费者侦听器(甚至来自不同实例)都具有相同的group.id 属性,那么其中只有一个会收到消息。您需要在初始化消费者时设置此属性。因此,在您的情况下,您需要一个 group.id 用于 AccountManagement,另一个用于 ActivityReporting。

    【讨论】:

    • 这是给卡夫卡的吗?另外,您是否知道生产者是否还需要指示消息是否被消费一次。正如我想象的那样,在某些情况下,您希望所有实例都能收到消息。谢谢
    • 是的,这是给 Kafka 的。生产者不影响消息的消费策略。如果您需要所有实例都使用消息,则每个实例必须具有不同的 group.id
    【解决方案2】:

    我会推荐Cadence Workflow,它是更强大的微服务编排解决方案。

    与在您的用例中使用队列相比,它提供了很多优势。

    • 内置指数重试,无限期间隔
    • 故障处理。例如,如果在配置的时间间隔内两次更新都无法成功,它允许执行通知另一个服务的任务。
    • 支持长时间运行的心跳操作
    • 能够实现复杂的任务依赖。例如,在发生不可恢复的故障时实现调用链或补偿逻辑 (SAGA)
    • 提供对当前更新状态的完整可见性。例如,当使用队列时,您知道队列中是否有一些消息,并且您需要额外的数据库来跟踪整体进度。使用 Cadence 记录每个事件。
    • 能够取消正在进行的更新。

    请参阅 the presentation,了解 Cadence 编程模型。

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 2019-11-19
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2017-10-19
      相关资源
      最近更新 更多