【问题标题】:Is it bad practice to produce and consume messages from the same topic?生成和使用来自同一主题的消息是不好的做法吗?
【发布时间】:2018-01-11 04:52:44
【问题描述】:

假设您有一个微服务架构,其中多个服务产生和使用 unit 状态。

有多种设计方法,您会推荐哪一种?

这些是我想到的一些选项:

  1. 创建一个通用主题unit-status 并让服务消费和产生关于这个主题的消息。这会导致您使用自己的消息并且必须过滤它们。我认为这是一个肮脏的解决方案,但对于新的新消费者来说很容易获得所有单元状态事件。
  2. 为每个状态创建一个特定主题,例如unit-status-createdunit-status-packagedunit-status-loadedunit-status-deleted 等。每个服务仅在其自己的主题上生成,但可以从主题列表中消费,不包括它自己的。例如,加载服务将从列表中消耗(unit-status-createdunit-status-deletedunit-status-packaged)。这允许服务仅对特定事件表现出兴趣,但是当添加新的状态主题时,可能需要对所有服务进行代码或配置更改。
  3. 为每个状态赋予它自己的分区,并从所有分区中使用,除了您在其中生成的那个。这种设计使事情变得更加复杂(记账哪个分区包含特定状态),添加分区时不会自动平衡,在活动时添加分区使事情变得更加冒险,因此没有我的偏好。

【问题讨论】:

  • 您能解释一下您是如何在消费者服务中使用单位状态的吗?
  • @WillC 考虑两个服务 unit-packing 和 unit-shipping。 unit-packing 服务为一个单元发出一个 unit-packed 状态。单位运输服务使用该状态并允许从该点开始运输。一旦发货,它也会发出状态 unit-shipped。另一个(customer-service-service)想要跟踪所有单元的状态,并且还消耗来自单元状态主题的所有状态。
  • 为什么删除服务需要从其他主题中消费,例如选项 2 示例中的 unit-status-created 和 unit-status-packaged?
  • @WillC 这确实是一个不好的例子,我已经更新了问题并将删除服务更改为加载服务。它想知道哪些单元被打包,因为这样它就可以开始加载过程。当单位被删除时,它可以清理它的状态。一旦加载一个单元,它就会产生单元加载事件
  • 很好奇你最终会在这里做什么@Christophe - 我现在面临同样的决定(但使用 SNS)。选项 1 成功了吗?

标签: apache-kafka activemq messaging microservices tibco-ems


【解决方案1】:

根据我的理解,我会建议第 1 点

添加新的微服务添加新的微服务将更容易,并且无需太多更改即可工作。

业务逻辑应该是微服务本身的一部分,而不是消息队列的一部分

【讨论】:

  • 您关于添加新主题的声明不符合第 1 点,第 1 点的意图是让所有服务都使用一个通用主题来处理某种类型的事件。它不会添加新主题。你到底是什么意思?我同意业务逻辑声明。
猜你喜欢
  • 2011-11-16
  • 2018-03-19
  • 2021-08-21
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多