首页 > 解决方案 > 为什么请求响应流中涉及的组件不应该使用 kafka 主题上的消息?

问题描述

作为我的客户端站点设计决策的一部分,http 请求-响应流中涉及的组件(微服务)被允许生成关于 kafka 主题的消息,但不允许使用来自 kafka 主题的消息。

这样的组件(微服务)可以读写数据库, 可以与其他组件通信,可以在一个主题上产生消息,但不能消费来自 kafka 主题的消息。

相反,该设计建议编写单独的实用程序来使用来自 kafka 主题的消息并存储在数据库中。请求-响应流程中涉及的组件(微服务)将从数据库中读取该信息。

如果此类组件(微服务)使用 kafka 主题,有哪些设计缺陷?为什么设计建议编写单独的实用程序来使用 kafka 主题并存储在数据库中,以便组件可以从数据库中读取这些信息。

标签: apache-kafkaarchitecturemicroservices

解决方案


Kafka Topics 被划分为分区,对于每个消费者组,分区分布在该组中的各个消费者之间。每个消费者负责消费分配的分区中的消息。

大概,您的请求处理机器是集群和负载平衡的。您可以通过两种方式让这些机器订阅 Kafka 主题,但这两种方式都被破坏了:

  1. 您可以将您的请求处理机器放在不同的消费者组中。在这种情况下,每个人都必须消费所有的消息。这可能不是您想要的,这通常是让每个消费者从队列中拉出并且每条消息只处理一次。此外,消费者将不同步,并将以不同的速率处理消息。
  2. 您可以将您的请求处理机器放在相同的消费者组中。在这种情况下,每个人都只能访问分配给它的分区。每台机器都会看到不同的消息流。当然,这也不是你想要的。根据负载均衡器将它们定向到哪台机器,客户端会得到不同的结果。

如果您希望所有请求处理机器从整个主题的同一消息队列中提取,那么它们需要与分配了所有分区的单个使用者进行通信。


推荐阅读