高可扩展性问题:如何跨多个微服务同步数据

时间:2019-06-11 10:33:06

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

我有以下用例:

  1. 假设您有两个微服务,其中一个AccountManagement和ActivityReporting用于处理事件U。
  2. 用户注册时,包含用户信息的事件U将发布到代理中,以供两个微服务处理。
  3. 出于性能和可伸缩性的原因,
  4. AccountManagement和ActivityReporting微服务跨两个实例每个复制。
  5. 每个微服务实例都有一个消费者在侦听代理主题。选择主题是为了使AccountManagement和ActivityReporting可以同时处理U。

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

请分享您在每个应用程序组,经纪人系统中实施一次消费的经验。

因为这将有效解决此问题。

2 个答案:

答案 0 :(得分:0)

如果即使来自不同实例的所有消费者侦听器都具有相同的group.id属性,则只有其中一个将接收到该消息。初始化使用者时,需要设置此属性。因此,在您的情况下,您需要一个group.id用于帐户管理,另一个需要ActivityReporting。

答案 1 :(得分:0)

我建议使用Cadence Workflow,它是微服务编排的更强大的解决方案。

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

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。

请参见介绍Cadence编程模型的the presentation