假设我有2个kafka主题登录和注销按用户名分区并且等分区数 。 如果我运行一个由2个消费者组成的消费者群体同时使用这两个主题,我是否可以确定每个用户的登录和注销事件将由同一个消费者处理?
答案 0 :(得分:0)
至少在默认配置下我不这么认为......让我解释得更好...... 想象一下,每个主题都有2个分区,因此: 登录主题有分区0和1(让他们称之为lin0,lin1) 注销主题有分区0和1(让他们称之为lout0,lout1)
我们将两个消费者都放在同一个消费者群体中,他们被称为c1和c2。 使用带有c1的subscribe()方法可能会发生它将获得lin0和lout1,而c2可能会获得lin1和lout0。 当生产者使用username = u1(例如)写入登录时,它可以使用与用户名u1的登录相关的消息进入lin0,并且该消息将由c1使用。可能会发生在注销时,生产者将用username = u1的消息写入lout0,由c2处理! 所以登录由c1处理,但是由c2注销!他们当然希望你不要这么做! 这种情况的发生是由于subscribe()方法处理自动分区分配和默认分区程序,它在生产者上以循环方式将消息分发给主题分区。
可能的解决方案可能是编写一个自定义分区程序以在生产者上使用,以便根据用户名的某些条件,u1将始终写在分区0上,用于两个主题(所以lin0和lout0)。 然后在消费者端使用assign(),因此要求特定的分区,例如c1,可以从lin0和lout0中准确地询问消费者。 当然,您将失去subscribe提供的重新平衡功能。