当前位置: 首页 > 知识库问答 >
问题:

如果kafka消费者使用多个主题,它是否处理相同的主题键?[重复]

赵超
2023-03-14

假设我有2个Kafka主题登录和注销按用户名分区,并具有相等数量的分区。如果我运行一个由两个消费者组成的消费者组,同时使用两个主题,我是否可以确定每个用户的登录和注销事件将由同一个消费者处理?

共有1个答案

穆彬郁
2023-03-14

我不这么认为,至少在默认配置下...让我解释得更好...假设每个主题有2个分区:登录主题有分区0和1(我们称之为lin0,lin1)注销主题有分区0和1(我们称之为lout0,lout1)

我们在同一消费群体中有两个消费者,他们被称为c1和c2。对c1使用subscribe()方法可能会得到lin0和lout1,而c2可能会得到lin1和lout0。当制作人将用户名=u1(例如)写入登录时,它可以进入lin0,并显示与用户名u1登录相关的消息,该消息将被c1使用。注销时,制作人可能会将用户名为u1的消息写入lout0,由c2处理!所以登录由c1处理,但注销由c2处理!当然,这是你不想要的!发生这种情况的原因是subscribe()方法处理自动分区分配,而默认分区器在生产者上以循环方式向主题分区分发消息。

潜在的解决方案可能是编写一个在生产者上使用的自html" target="_blank">定义分区程序,以便使用基于用户名的一些标准,u1将始终在分区0上为两个主题(所以lin0和lout0)编写。然后在消费者端使用赋值(),因此请求特定的分区,例如c1可以从lin0和lout0请求消费者。当然,你会失去订阅提供的再平衡功能。

 类似资料:
  • 然而,当在我的环境中测试此示例时,我得到了一个异常。

  • 我有一个主题列表(目前是10个),其大小可以在未来增加。我知道我们可以产生多个线程(每个主题)来消耗每个主题,但在我的例子中,如果主题的数量增加,那么消耗主题的线程数量也会增加,这是我不希望的,因为主题不会太频繁地获取数据,所以线程将是理想的。 有没有办法让单个消费者从所有话题中消费?如果是的话,我们怎样才能做到呢?另外,Kafka将如何维护抵消?请建议答案。

  • 我是AMQP的新手,正在尝试为RabbitMQ系统制定一个通知架构。 我想要一个主题交换(通知交换,比方说),特别是因为我想灵活地使用主题交换附带的路由密钥和队列,以及将来扩展该主题的更多选项。不过,我可能是错的,因为... 我还想让两个或更多的消费者使用每个通知。作为基线,我希望发布的每个通知都在数据库中结束。此外,我希望每个通知都可以由客户端应用程序使用(例如,web应用程序使用并进一步通过套

  • 我们正在开发一个应用程序,我们想听Kafka中不止一个主题。所有主题都有一个分区。所有主题名称都有一个公共的前缀,例如“test-x”、“test-y”,所以我们可以对它使用spring。 我们希望编写一个java spring使用者,它使用模式监听所有主题。我们的想法是,我们可以运行同一个消费者(属于同一个组)的多个实例,Kafka将为不同的消费者分发来自不同主题的消息。 然而,这似乎并不奏效。

  • 如何在apache/kafka中使用regex消费所有主题?我尝试了上面的代码,但不起作用。

  • 我的问题与单个消费者从多个话题消费有关。假设所有主题都加载了1M个记录,一个使用者必须处理这些记录。它将按照什么顺序从主题中读取(我的意思是首先读取哪个主题/分区,等等) Kafka内部资料的任何链接会有帮助吗?