python之kafka使用

由于在项目中需要作为生产者向kafka发送消息,所有在pypi上根据Weight值下载了最高的kafka 1.3.5模块

根据开发手册写了一个简单的生产者demo,代码如下:

from kafka import KafkaProducer

try:

     producer = KafkaProducer(bootstrap_servers='192.168.55.40:9092')   #kafka的broker的ip、port

     producer.send('test001', '111')     #主题:test001  消息:111

     producer.close()   #关闭连接

except Exception,e:

     print str(e)


简单测试没有问题。


但是自己在消息中间件的日志里面缺看到了报错,但是没有影响到生产者生产和消费者消费。

报错信息如下:

ERROR Closing socket for /192.168.55.40 because of error (kafka.network.Processor)
kafka.common.KafkaException: Wrong request type 18
        at kafka.api.RequestKeys$.deserializerForKey(RequestKeys.scala:64)
        at kafka.network.RequestChannel$Request.<init>(RequestChannel.scala:50)
        at kafka.network.Processor.read(SocketServer.scala:450)
        at kafka.network.Processor.run(SocketServer.scala:340)
        at java.lang.Thread.run(Thread.java:745)


根据这个错误查到的资料很少,而且报错信息说明是协议不符合,后来发现kafka不同版本对于api有一些不一样的地方

kafka的协议基于tcp+字节流进行交互,其中一个字段api_version,是需要客户端把kafka的版本好传递进去。

此文分析了kafka协议的传输:http://blog.csdn.net/jewes/article/details/42744855 


解决办法:

producer = KafkaProducer(bootstrap_servers='192.168.55.40:9092',api_version=(0.8.2))  

在初始化时候把版本好传递进去,否则api里面默认为None


这个有一个弊端就是需要我们根据在kafka的升级修改对应的代码。


kafkaka 0.5.0这个可以不需要传如版本。






猜你喜欢

转载自blog.csdn.net/zt3032/article/details/78327410
今日推荐