扭曲的python从kafka读取并写入elasticsearch

时间:2016-10-02 07:12:34

标签: python asynchronous twisted

我是Twisted的新手,这是我的第一个程序。

我找不到使用kafka-python库中的KafkaConsumer的方法,并使用treq来触发对elasticsearch的发布请求。

我可以用小块分解问题: 创建一个kafka使用者迭代器并从中读取数据(主题可能很大)

def consumeKafka():
    consumer = KafkaConsumer(bootstrap_servers="kafka:9092", auto_offset_reset='earliest')
    consumer.subscribe(['kafkapipeline'])
    for v in consumer:
        v.value

使用treq发布到elasticsearch

def post(self):
    d = treq.post('http://es:9200/pro/pr/', self.data)
    d.addCallbacks(lambda x: print(x), lambda x: print("error %s " % x))

启动反应堆

from twisted.internet import reactor
reactor.callWhenRunning(consumeKafka)
reactor.run()

知道如何使这项工作吗?

1 个答案:

答案 0 :(得分:0)

我根本不使用Kafka,所以我不确定这是否适合你。另外,我假设您在同时运行Kafka和treq时遇到了麻烦。我在Twisted中处理迭代器的一般方法是使用inlineCallbacks等待结果,然后对该结果执行某些操作。

from twisted.internet import defer

@defer.inlineCallbacks
def consumeKafka():
    consumer = KafkaConsumer(bootstrap_servers="kafka:9092", auto_offset_reset='earliest')
    consumer.subscribe(['kafkapipeline'])
    for v in consumer:
        value = yield v.value
        # do stuff with value

然后你可以简单地调用这个函数,反应器将负责其余的工作。所以你的主要部分将如下所示:

consumeKafka()
reactor.run()

请注意,consumeKafka()函数返回Deferred,因此您可以根据需要添加回调和错误。熟悉此模型后,请查看Cooperator个对象以获取更多功能。