最近在研究 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 服务器通信了~。