如何使用gevent的pykafka组消费者?

时间:2017-10-28 05:59:19

标签: python python-3.x apache-kafka gevent pykafka

我使用gevent的pykafka group consumer,但结果有重复的数据。 显示我的代码:

import gevent
from pykafka import KafkaClient

topic_name = 'test2'
bootstrap_servers = '192.168.199.228:9094,192.168.199.228:9092,192.168.199.228:9093'
group = 'test_g'


def get_consumer():
    client = KafkaClient(hosts=bootstrap_servers, use_greenlets=True)
    topic = client.topics[topic_name.encode()]

    consumer = topic.get_simple_consumer(auto_commit_interval_ms=10000,
                                     consumer_group=group.encode(),
                                     auto_commit_enable=True,
                                     )
    return consumer


def worker(worker_id):
    consumer = get_consumer()
    for msg in consumer:
        print('worker {} partition: {}, offset: {}'.format(worker_id, msg.partition, msg.offset))


if __name__ == '__main__':
    tasks = [gevent.spawn(worker, *(i, )) for i in range(3)]
    ret = gevent.joinall(tasks)

reulst: 任何人都可以告诉我如何使它工作,pykafka不支持gevent吗?

1 个答案:

答案 0 :(得分:0)

我打赌这个问题与你对gevent的使用没有任何关系。您注意到消费者的重复数据的原因是您使用的是SimpleConsumer而不是BalancedConsumerSimpleConsumer不执行自动平衡 - 它只是从其起始偏移量中消耗整个主题。因此,如果您在此处并排运行许多SimpleConsumer个实例,则每个实例将从其起始偏移量中消耗整个主题。 BalancedConsumertopic.get_balanced_consumer(consumer_group='mygroup'))可能就是你想要的。它使用消费者重新平衡算法来确保在同一组中运行的使用者不会收到相同的消息。为此,您的主题需要至少与您使用它的进程一样多的分区。有关详细信息,请参阅pykafka READMEdocumentation