kafka 同一个消费组里 多个消费者 使用 consumer.assign (topicPartitions);会造成数据重复吗?

问答 shishuai19910217 ⋅ 于 2019-04-19 15:54:41 ⋅ 最后回复由 root 2020-03-29 17:37:28 ⋅ 16116 阅读

有两个消费者 同属于消费组A 都消费topic1的数据
两个消费者都是使用assign 手动指定分区 两个消费者指定的分区是一样的
请问 这两个消费者消费的数据会重复吗?

回复数量: 8
  • 青牛 海汼部落创始人,80后程序员一枚,曾就职于金山,喜欢倒腾技术做产品
    2019-04-19 17:06:01

    不会 kafka保证的了一条消费只能消费一次

  • shishuai19910217
    2019-04-19 17:29:58

    @青牛 謝謝 但是我写了一个例子是起了两个线程(模拟有两个消费者)结果就是线程A消费分区1的时候线程B也在消费分区1 不是说在同一个分组下一个分区只能被一个消费者消费吗 ?那为什么线程A和线程2会出现同时消费一个分区的情况?官网上的解释是使用assign就不會被group管理了 那这是不是就说明使用assign后会造成数据重复消费的问题?

  • shishuai19910217
    2019-04-19 17:40:03

    public class kafkaConsumer extends Thread {

    private String topic;
    
    public kafkaConsumer() {
        super();
    
    }
    
    @Override
    public void run() {
        List<String> topicList = Arrays.asList("topic1","topic2","topic3","topic4","topic5","topic6");
        KafkaConsumer consumer = createConsumer("aa");
        List<TopicPartition> topicPartitions = new ArrayList<>();
        for(String topic : topicList){
            List<PartitionInfo> partitionInfos = consumer.partitionsFor(topic);
            for (PartitionInfo info : partitionInfos) {
                TopicPartition topicPartition = new TopicPartition(info.topic(), info.partition());
                topicPartitions.add(topicPartition);
            }
        }
        consumer1.assign(topicPartitions);
        while (true){
            ConsumerRecords<String, String> records = consumer.poll(1100);
    
            for (ConsumerRecord<String, String> record : records) {
    
                System.out.println("---------"+Thread.currentThread().getName()+"---"+record.topic()+"---"+record.partition()+"-----"+record.value());
    
            }
            try {
                Thread.sleep(2000);
            }catch (Exception e){}
        }
    }
    
    private KafkaConsumer createConsumer(String groupName) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "127.0.0.1:9092");
        props.put("group.id", groupName);
        props.put("enable.auto.commit", "true");
        props.put("max.poll.records", "100");//原来500 减小为100
        props.put("auto.commit.interval.ms", "1000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        return consumer;
    }
    
    public static void main(String[] args) {
        new kafkaConsumer().start();// 使用kafka集群中创建好的主题 test
        new kafkaConsumer().start();// 使用kafka集群中创建好的主题 test
    
    }

    }

  • shishuai19910217
    2019-04-19 17:49:41

    是不是我在代码中使用try {
    Thread.sleep(2000);
    }catch (Exception e){}
    导致的?

  • shishuai19910217
    2019-04-19 17:49:50

    file

  • 青牛 海汼部落创始人,80后程序员一枚,曾就职于金山,喜欢倒腾技术做产品
    2019-04-22 11:17:18

    KafkaConsumer consumer = createConsumer("aa"); 把consumer的名字改成每个线程不一样试试

  • shishuai19910217
    2019-04-23 17:35:52

    @青牛 不一样是没问题的

  • root
    2020-03-29 17:37:28

    你好,请问最后是怎么解决的?我也遇到同样问题

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter