kafka经常遇到这样一个问题:我按客户id对消息进行分区,有时客户会收到大量消息。结果,这个客户和同一分区中所有其他客户的消息都会延迟。
有众所周知的方法来处理这个问题吗?可能与其他消息平台?
理想情况下,只有一个客户的信息会被延迟。其他用户的信息将获得同等份额的用户带宽。
注意:我必须按客户id进行分区,因为我希望按顺序使用任何给定自定义的消息。但是,我可以按任意顺序使用两个客户的消息。
kafka经常遇到这样一个问题:我按客户id对消息进行分区,有时客户会收到大量消息。结果,这个客户和同一分区中所有其他客户的消息都会延迟。
有众所周知的方法来处理这个问题吗?可能与其他消息平台?
理想情况下,只有一个客户的信息会被延迟。其他用户的信息将获得同等份额的用户带宽。
注意:我必须按客户id进行分区,因为我希望按顺序使用任何给定自定义的消息。但是,我可以按任意顺序使用两个客户的消息。
1条答案
按热度按时间6l7fqoea1#
我将根据所提供的有限信息来回答。
kafka partitoins是可伸缩性的smalles单位,因此,例如,如果您有10个并行使用者(kafka topic listeners),则您应该按此数字或更高的值对主题进行分区,否则,由于kafka以一种只有一个使用者从partiton获取消息的方式管理使用者,因此您的一些侦听器将被饿死。这是为了防止分区将消息顺序混合在一起。另一种方法是支持的,因为消费者一次可以处理多个partition。
我的设计解决方案是决定您计划为消费者(微服务)示例分配多少容量?这个数字将引导您找到正确的partitons数。
我会避免使用动态数量的partitons,因为这不能很好地扩展。使用与您计划分配的容量相匹配的数字和一些额外的备用磁盘,以备将来需要扩展。假设明天你有5个新客户,添加partitons既不容易也不明智。
kafka将确保每个分区的消息保持有序,因此这对于您的用例是免费的。您需要的是在消费者端能够以正确的顺序处理不同的客户id消息。为避免同一客户收到的信息混淆订单,您的部门必须是更高级别的客户类别,我可以考虑客户类型/地区/大小。。。其思想是所有单个客户的消息都停留在同一主题中。
partitoin密钥必须与消息/数据的大小相关,以便消息只在kafka集群上传播。这有助于Kafka集群的规模和冗余本身。
决定正确的分区策略是很困难的,但是花在计划上的时间是值得的。
一个经常出现的设计解决方案是散列。使用散列从客户idMap分区号到分区键。同样,确定一个固定的partiton编号,并让hash将客户idMap到partiton密钥。
使用x模分区
x客户有很多信息,每个客户需要一个主题。因此,在本例中,您为每个主题Map一个客户,因此您的模将是这些客户的数量。
y客户是低流量客户,例如,这些客户使用不同的y/5模,因此您有5个客户共享一个主题。
确保将x分区号添加到y分区号,这样就不会重叠。
我看到的唯一问题是这种方法不灵活,如果客户数量发生变化,就不能更改Map。您可以在每个组中允许更多的主题来支持将来的partitons。