具有QoS/Kafka分区重载的消息传递平台

Arn*_*anc 6 messaging apache-kafka

我在Kafka遇到了一个经常出现的问题:我按客户ID对邮件进行分区,有时会发生客户收到大量邮件的情况.结果,该客户和同一分区中的所有其他客户的消息被延迟.

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

理想情况下,只会延迟一个客户的消息.其他客户的消息将获得消费者带宽的相等份额.

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

Gad*_*adi 4

我会根据所提供的有限信息尝试回答。

Kafka 分区是可扩展性的最小单位,因此,例如,如果您有 10 个并行消费者(kafka 主题侦听器),您应该按此数字或更高的数量对您的主题进行分区,否则,您的一些侦听器将在 kafka 管理消费者时挨饿。这样只有一个消费者将从一个分区获取消息。这是为了防止分区混合消息顺序。支持另一种方式,因为消费者可以一次处理多个分区。

我的设计解决方案将是决定您计划为消费者(微服务)实例分配多少容量?该数字将引导您找到正确的分区数量。

我会避免使用动态数量的分区,因为这不能很好地扩展。使用与您计划分配的容量相匹配的数量以及一些额外的备用容量,以备将来需要扩展时使用。假设明天您有 5 个新客户,添加分区并不容易也不明智。

Kafka 将确保每个分区的消息保持有序,因此这对于您的用例来说是免费的。您需要的是消费者端能够以正确的顺序处理不同的客户 ID 消息。为了避免发送给同一客户的消息出现混合顺序,您的分区必须是更高级别的客户类别,我可以想到客户类型/区域/大小...这个想法是所有单个客户消息都保留在同一主题中。

您的分区密钥必须与消息/数据的大小相关,以便您的消息均匀地分布在您的 kafka 集群上。这有助于 kafka 集群规模和冗余本身。

决定正确的分区策略很困难,但花时间进行规划是值得的。

一种经常出现的设计解决方案是散列。使用 HASH 将分区号从客户 ID 映射到分区键。再次确定固定的分区号,并让哈希将客户 ID 映射到您的分区键。

使用 X 模分区

X 客户有很多消息,您需要为每个客户指定一个主题。因此,在这种情况下,您为每个主题映射一个客户,因此您的模将是这些客户的数量。

Y 客户是低流量客户,因为这些客户使用 Y/5 的不同模数,因此您有 5 个客户共享一个主题。

确保将 X 分区编号添加到 Y 分区编号,以免重叠。

我看到的唯一问题是这不灵活,如果客户数量发生变化,您将无法更改映射。您可以允许每个组中有更多主题以支持未来的分区。