apache-kafka - 具有 QoS/Kafka 分区过载的消息传递平台

标签 apache-kafka messaging

我经常遇到 Kafka 问题:我按客户 ID 对消息进行分区,有时客户会收到大量消息。因此,该客户和同一分区中所有其他客户的消息会延迟。

有没有众所周知的方法来处理这个问题?可能与其他消息传递平台?

理想情况下,只有一位客户的消息会被延迟。其他客户的消息将获得同等份额的消费者带宽。

注意:我必须按客户 ID 进行分区,因为我想按顺序使用任何给定自定义的消息。但是,我可以按任意顺序使用两个客户的消息。

最佳答案

我将根据提供的有限信息尝试回答。
Kafka 分区是可扩展性的最小单位,因此,例如,如果您有 10 个并行消费者(kafka 主题监听器),则应按此数字或更高的数字划分主题,否则,您的某些监听器会因为 kafka 管理消费者而感到饥饿只有一个消费者将从分区中获取消息的方式。这是为了保护分区免受混合消息顺序的影响。支持另一种方式,因为消费者一次可以处理多个分区。
我的设计解决方案是决定您计划为消费者(微服务)实例分配多少容量?此数字将引导您选择正确的分区数。
我会避免使用动态数量的分区,因为这不能很好地扩展。使用与您计划分配的容量相匹配的数量以及一些额外的备用设备,以备将来需要扩展时使用。假设明天您有 5 个新客户,添加分区并不容易或明智。
Kafka 将确保每个分区的消息保持有序,因此这对于您的用例是免费的。您需要的是在消费者端能够以正确的顺序处理不同的客户 ID 消息。为了避免发送给同一客户的消息混合顺序,您的分区必须是更高级别的客户类别,我可以考虑客户类型/区域/规模......这个想法是所有单个客户消息都保留在同一主题中。
您的 partitoin key 必须与消息/数据的大小相关,以便您的消息在您的 kafka 集群中均匀传播。这有助于 kafka 集群规模和冗余本身。
决定正确的分区策略很难,但花时间规划它是值得的。
一个经常出现的设计解决方案是散列。使用 HASH 将分区号从客户 ID 映射到分区键。同样,决定一个固定的分区号,并让 HASH 将客户 ID 映射到您的分区键。
使用 X 模分区
X 个客户有很多消息,您需要为每个客户设置一个主题。因此,在这种情况下,您可以为每个主题映射一个客户,因此您的模数将是这些客户的数量。
Y 客户是低流量客户,例如,这些客户使用不同的 Y/5 模数,因此您有 5 个客户共享一个主题。
确保将 X 分区号添加到 Y 分区号,以免重叠。
我看到的唯一问题是这不灵活,如果客户数量发生变化,您无法更改映射。您可以在每个组中允许更多主题以支持 future 的分区。

关于apache-kafka - 具有 QoS/Kafka 分区过载的消息传递平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484834/

相关文章:

rabbitmq - 在微服务的发布/订阅模型中,如何只接收/使用每种服务类型的消息一次

java - 如何列出kafka集群的所有生产者?

cassandra - 将数据从 Kafka 实时流式传输到 Cassandra

java - Java 中的通用 QoS 消息批处理和压缩

Swing 应用程序监听 Grails 应用程序中的变化

azure - 如何保证消息传输可靠-ASB

java - Apache Kafka 根据消息的值对窗口消息进行排序

apache-kafka - 带 Hel​​idon 的 Kafka 连接器

java - JSON对象: How to map的Kafka流消费者

java - 无法从与 StateStore 不同的应用程序访问 KTable