apache-kafka - 为什么请求响应流中涉及的组件不应该使用 kafka 主题上的消息?
问题描述
作为我的客户端站点设计决策的一部分,http 请求-响应流中涉及的组件(微服务)被允许生成关于 kafka 主题的消息,但不允许使用来自 kafka 主题的消息。
这样的组件(微服务)可以读写数据库, 可以与其他组件通信,可以在一个主题上产生消息,但不能消费来自 kafka 主题的消息。
相反,该设计建议编写单独的实用程序来使用来自 kafka 主题的消息并存储在数据库中。请求-响应流程中涉及的组件(微服务)将从数据库中读取该信息。
如果此类组件(微服务)使用 kafka 主题,有哪些设计缺陷?为什么设计建议编写单独的实用程序来使用 kafka 主题并存储在数据库中,以便组件可以从数据库中读取这些信息。
解决方案
Kafka Topics 被划分为分区,对于每个消费者组,分区分布在该组中的各个消费者之间。每个消费者负责消费分配的分区中的消息。
大概,您的请求处理机器是集群和负载平衡的。您可以通过两种方式让这些机器订阅 Kafka 主题,但这两种方式都被破坏了:
- 您可以将您的请求处理机器放在不同的消费者组中。在这种情况下,每个人都必须消费所有的消息。这可能不是您想要的,这通常是让每个消费者从队列中拉出并且每条消息只处理一次。此外,消费者将不同步,并将以不同的速率处理消息。
- 您可以将您的请求处理机器放在相同的消费者组中。在这种情况下,每个人都只能访问分配给它的分区。每台机器都会看到不同的消息流。当然,这也不是你想要的。根据负载均衡器将它们定向到哪台机器,客户端会得到不同的结果。
如果您希望所有请求处理机器从整个主题的同一消息队列中提取,那么它们需要与分配了所有分区的单个使用者进行通信。
推荐阅读
- python - 保存到文件时在远程服务器上运行的 Python 代码失败并出现 OSError,尽管在代码的早期成功保存到同一位置
- genexus - 如何让 GAM 会话保持活跃?
- reporting-services - 如何格式化没有符号的负数
- r - 具有空间约束的层次聚类 (ClustGeo)
- python - (Django)管理数据表不在选择字段中显示数据
- c - 将 C 浮点数组转换为浮点结构,反之亦然?
- raspberry-pi - org.chromium.Chromium:错误的 ELF 类:ELFCLASS64
- ubuntu - xubuntu - 禁用开关窗口弹出
- laravel - 参数 #1 必须是 Model 类型,Pest\Mock\Mock 给定
- java - 仅在特定情况下保留 Vaadin 中的视图状态