Java Spring Kafka-选择@TopicPartition将停用组中的使用者
我有两个消费群体Java Spring Kafka-选择@TopicPartition将停用组中的使用者,java,spring,spring-boot,apache-kafka,publish-subscribe,Java,Spring,Spring Boot,Apache Kafka,Publish Subscribe,我有两个消费群体第一个和第二个使用Spring Boot版本2.1.8订阅了我的主题主题。我有两个服务使用每个单独的消费者群体 使用I定义侦听器: @KafkaListener(topics = "my-topic") public void consume(@Payload String message) { logger.info(String.format("#### -> Consumed message -> %s", message)); } @KafkaLis
第一个
和第二个
使用Spring Boot版本2.1.8订阅了我的主题
主题。我有两个服务使用每个单独的消费者群体
使用I定义侦听器:
@KafkaListener(topics = "my-topic")
public void consume(@Payload String message) {
logger.info(String.format("#### -> Consumed message -> %s", message));
}
@KafkaListener(topicPartitions = {
@TopicPartition(
topic = "my-topic",
partitions = { "0", "2" }
)}
)
public void consume(@Payload String message) {
logger.info(String.format("#### -> Consumed message -> %s", message));
}
使用kafka消费群体的列表显示以下内容:
root@8d49c1b2c3bf:/# kafka-consumer-groups --bootstrap-server localhost:9092 --describe --all-groups
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
first my-topic 2 0 0 0 consumer-2-42b222ac-998a-4629-8358-1846c85f37e7 /172.18.0.9 consumer-2
first my-topic 0 0 0 0 consumer-2-42b222ac-998a-4629-8358-1846c85f37e7 /172.18.0.9 consumer-2
first my-topic 1 0 0 0 consumer-2-42b222ac-998a-4629-8358-1846c85f37e7 /172.18.0.9 consumer-2
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
second my-topic 0 0 0 0 consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8 consumer-2
second my-topic 1 0 0 0 consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8 consumer-2
second my-topic 2 0 0 0 consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8 consumer-2
我希望first
组中的使用者只使用0和2个分区,因此我尝试使用侦听器实现它:
@KafkaListener(topics = "my-topic")
public void consume(@Payload String message) {
logger.info(String.format("#### -> Consumed message -> %s", message));
}
@KafkaListener(topicPartitions = {
@TopicPartition(
topic = "my-topic",
partitions = { "0", "2" }
)}
)
public void consume(@Payload String message) {
logger.info(String.format("#### -> Consumed message -> %s", message));
}
为什么使用相同命令的列表除了第一个组的分区1外,没有显示与上面相同的内容?此外,消费者ID
值和进一步值均为空,@KafkaListener
对于第一个
组(第二个
组中的侦听器的工作原理相同)接收无消息。如何修复它
Consumer group 'first' has no active members.
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
first my-topic 2 0 0 0 - - -
first my-topic 0 0 0 0 - - -
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
second my-topic 0 0 0 0 consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8 consumer-2
second my-topic 1 0 0 0 consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8 consumer-2
second my-topic 2 0 0 0 consumer-2-294ef783-2cd8-450b-8ac0-9e8a2f287df8 /172.18.0.8 consumer-2
由于您正在向特定分区分配使用者线程,Kafka将使用assign()
方法,而不会使用组协调。即使每个消费者与另一个消费者共享一个groupId,每个消费者也会独立行事
假设您希望始终从所有分区读取所有记录(例如,当使用压缩主题加载分布式缓存时),手动分配分区而不使用Kafka的组管理可能会很有用
但是检查消费者位置的命令将仅显示使用组协调的消费者的位置
有时,了解消费者的立场很有用我们有一个工具,可以显示所有消费者在一个消费者群体中的位置,以及他们离日志末尾有多远。要在名为my group的消费者组上运行此工具,请使用名为my topic的主题
手动分区分配不使用组协调,因此使用者故障不会导致重新平衡分配的分区。即使每个消费者与另一个消费者共享一个groupId,它们也会独立行事。为避免偏移提交冲突,通常应确保每个使用者实例的groupId是唯一的。
侦听器不使用消息的最后一个原因是偏移量,默认情况下,偏移量设置为最新,您需要特别像这样指定偏移量位置
@KafkaListener(id = "thing2", topicPartitions =
{ @TopicPartition(topic = "topic1", partitions = { "0", "1" }),
@TopicPartition(topic = "topic2", partitions = "0",
partitionOffsets = @PartitionOffset(partition = "1", initialOffset = "100"))
})
public void listen(ConsumerRecord<?, ?> record) {
...
}
@KafkaListener(id=“thing2”,主题分区=
{@TopicPartition(topic=“topic1”,partitions={“0”,“1”}),
@TopicPartition(topic=“topic2”,partitions=“0”,
PartitionOffset=@PartitionOffset(partition=“1”,initialOffset=“100”))
})
公共无效侦听(消费者记录记录){
...
}
有关
第一个构造函数接受一个TopicPartitionOffset参数数组,以明确指示容器使用哪些分区(使用consumer assign()方法),并使用可选的初始偏移量。默认情况下,正值是绝对偏移量。默认情况下,负值相对于分区内的当前最后一个偏移量。提供了TopicPartitionOffset的构造函数,该构造函数采用附加的布尔参数。如果这是真的,则初始偏移(正或负)相对于此耗电元件的当前位置。偏移量在容器启动时应用
注意:您可以在“分区”或“分区偏移量”属性中指定每个分区,但不能同时指定两者。感谢您通过链接给出非常有用的答案。我会读它,晚上试一下。这种神奇的数字背后有什么原因吗?
initialOffset=“100”
?100
表示分区的偏移量,通过上述配置,您指定使用者线程读取表单分区1和偏移量100@Nikolas