Kafka制作人没有选择新的分区

时间:2017-05-18 20:21:20

标签: python apache-kafka kafka-consumer-api kafka-producer-api kafka-python

我是Kafka的新手,我正在尝试构建一项服务来为其提供消息传递平台服务。这是我的设置:

Kafka 0.9.0.1
Zookeeper 3.4.8
kafka-python 1.3.3

我的应用程序创建了一个KafkaProducer,我将一个消息流发送到一个包含6个分区的主题。我还创建了7个KafkaConsumer s(在单个group_id下,其中6个被分配到6个分区,其中一个处于空闲状态(这是预期的)。当生产者正在流式传输时,我将分区计数增加到7,期望流不会分布在7个分区上,并且会唤醒空闲的消费者。但是,似乎生产者没有拿起新添加的分区,直到我重新开始通过重新启动应用程序来初始化它。我通过运行以下来扩展分区计数:

kafka-topics --alter --zookeeper localhost:2181 --topic test --partitions 7

生产者有没有办法在没有重新初始化的情况下获取分区计数的变化?

这里是关联的代码段:

生产者

class Producer(threading.Thread):
daemon = True

def __init__(self, name, manager):
    super(Producer, self).__init__()
    self.producer = KafkaProducer(bootstrap_servers='localhost:9092')

def run(self):
    while not self.killed:
        if not self.q.empty():
            self._busy()
            self.producer.send('test', value=self.q.get())
        else:
            self._free()

消费者

class Consumer(threading.Thread):
    daemon = True

    def __init__(self, name, manager):
        super(Consumer, self).__init__()
        self.consumer = KafkaConsumer(bootstrap_servers='localhost:9092',
                                 group_id='test_group',
                                 client_id="Consumer " + self.name)
        self.consumer.subscribe(['test'])

    def run(self):
        while not self.killed:
            messages = self.consumer.poll()

            for topic, records in messages.iteritems():
                print self.consumer.config['client_id'] + ": " + str(records)

1 个答案:

答案 0 :(得分:0)

我遇到了一个可能类似的问题,并且能够找到解决方案。我在这里写的: How does librdkafka producer learn about new topic partitions in Kafka

如果您的测试太短,那可能是生产者不了解新分区的原因。默认情况下,参数topic.metadata.refresh.interval.ms为300000(以ms为单位),因此代理将每5分钟刷新生产者中的元数据。如果添加分区后测试花费了超过5分钟的时间,那么这不是原因。