pynsq使用

最近在研究nsqd分布式消息队列,我想使用pynsq对nsqd进行消息插入和获取,使用过程中遇到了一些小坑,所以把这篇文章写出来避免大家入坑。

首先你要确保你已经在服务器上面运行了nsqd和nsqlookupd

安装pynsq

pip install pynsq

消费者

import nsq

def handler(message):

print(message.body)

returnTrue

r = nsq.Reader(message_handler=handler,

#nsqd_tcp_addresses=['192.168.100.192:4151'],

lookupd_http_addresses=['http://192.168.100.192:4161'],

topic='duduniao', channel='duduniao', lookupd_poll_interval=15)

nsq.run()
使用过程中你可能会遇到如下错误
WARNING:tornado.general:Connect error on fd 712: [Errno 11001] getaddrinfo failed
WARNING:tornado.general:Connect error on fd 712: [Errno 11001] getaddrinfo failed
WARNING:nsq.reader:[node2:4150:duduniao:duduniao] connection closed
WARNING:nsq.reader:[node2:4180:duduniao:duduniao] connection closed
出现这个错误的原因是因为无法找到nsqd的主机解析,你可以使用DNS或添加Hosts记录解决这个问题。
pynsq源码中获取nsqd主机连接地址使用的是broadcast_address,而broadcast_address默认是主机名。
请求nsqlookupd api接口可以发现node节点broadcast_address是主机名。

nsqd启动选项中也有说明

--broadcast-address  这个地址是注册到lookupd的地址默认是主机名

另一种解决方法就是启动nsqd时指定这个参数

更改启动脚本

nsqd --broadcast-address=192.168.100.192

这个时候在nsqlookupd上面看node节点的注册地址就是ip了

这样即使我们不写hosts记录或dns解析也能成功与nsqd服务器通信了~。

 

欢迎留言