鍍金池/ 問答/人工智能  C++  GO/ kafka多個消費者只有一個消費

kafka多個消費者只有一個消費

使用goalng "github.com/Shopify/sarama"這個庫

我現(xiàn)在有兩個消費者,兩個topic,kafka分區(qū)設(shè)定是50個,但是在實際運行過程中只有一個消費者在消費,關(guān)閉當(dāng)前能消費的消費者,另外一個也可以消費,但是同時運行是就不行

看網(wǎng)上的文檔說的是因為分區(qū)不夠的原因,但是我現(xiàn)在設(shè)定了50個分區(qū),只有兩個消費者
代碼1

    producerConfig := sarama.NewConfig()
    producerConfig.Producer.Partitioner = sarama.NewHashPartitioner
    producerConfig.Producer.Return.Successes = true
    producerConfig.Producer.Timeout = 5 * time.Second
    producer, err = sarama.NewSyncProducer([broker實例地址], producerConfig)


    kafka_msg := &sarama.ProducerMessage{
        Topic:topic,
        Key:sarama.StringEncoder(key),
        Value: sarama.StringEncoder(value),
    }
    partition, offset, err := producer.SendMessage(kafka_msg)

這樣,投遞成功之后返回的分區(qū)id永遠是0,我懷疑是不是因為我分區(qū)設(shè)置值沒有生效,

,但是因為是第一次用kafka,所以不確定,

于是使用下一個方式
代碼2

    producerConfig := sarama.NewConfig()
    // producerConfig.Producer.Partitioner = sarama.NewHashPartitioner
    producerConfig.Producer.Return.Successes = true
    producerConfig.Producer.Timeout = 5 * time.Second
    producer, err = sarama.NewSyncProducer([broker實例地址], producerConfig)


    kafka_msg := &sarama.ProducerMessage{
        Topic:topic,
        Key:sarama.StringEncoder(key),
        Value: sarama.StringEncoder(value),
        Partition: 7 ,
    }
    partition, offset, err := producer.SendMessage(kafka_msg)

這樣設(shè)置后投遞成功分區(qū)返回也是0。

我想確認的是,在分區(qū)設(shè)置生效的前提先,如果我用代碼2來寫,最終投遞到的分區(qū)是不是7 ?

我現(xiàn)在懷疑是因為分區(qū)配置沒有生效
請大神解答

回答
編輯回答
任她鬧

kafka里面有單播和廣播的區(qū)別,對一條消息來說,同一個消費組內(nèi)的消費者有競態(tài)關(guān)系,只有一個消費者能消費,這個是單播;同樣,對一條消息,不同消費組的消費者都可以同時消費,這是多播。假如你想讓兩個消費者都能同時消費到消息,你可以將這兩個消費者放在不同的消費組,這個需要消費端的groupId屬性來設(shè)置。

2017年6月3日 09:34
編輯回答
初心

一個分區(qū)只能被消費者組中的一個消費者消費,我猜你這里是因為每次發(fā)送的消息都發(fā)送到了同一個分區(qū)

2017年3月31日 15:03
編輯回答
祉小皓

你的兩個消費者應(yīng)該是在同一個分組中,在kafka中,一條消息可以被多個分組消費,但是只能被一個分組中的一個消費者消費。

2018年1月10日 22:11