nsq深入浅出
快速使用
1、启动顺序:
nsqlookupd
nsqd --lookupd-tcp-address=127.0.0.1:4160
nsqadmin --lookupd-http-address=127.0.0.1:4161
2、发送消息
curl -d 'hello world 1' 'http://127.0.0.1:4151/pub?topic=test'
3、消费消息
nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161
4、UI管理界面
http://127.0.0.1:4171/
特点
- 无单点故障
- 水平扩展
- 低延迟
- 组合负载均衡和多播样式的消息路由
- 擅长流(高吞吐量)和面向工作(低吞吐量)的工作负载
- 主要在内存中(在高水位标记之外的消息透明地保存在磁盘上)
- 消费者查找生产者的运行时发现服务(nsqlookupd)
- 传输层安全性(TLS)
- 数据格式不可知
- 很少的依赖关系(易于部署)和正常的、有边界的默认配置
- 简单的TCP协议,支持任何语言的客户端库
- 用于统计、管理操作和生产者的HTTP接口(不需要发布客户机库)
- 与statsd集成,实现实时检测
- 健壮的集群管理接口(nsqadmin)
保证
与任何分布式系统一样,实现目标需要进行智能权衡。通过对这些权衡的真实情况保持透明,我们希望设定NSQ在生产环境中部署时的行为预期
1、消息非持久化(默认):
事实可以通过 –mem-queue-size 设定一个阀值,大于阀值nsq背后自动的持久化消息到磁盘。可以把 –mem-queue-size 设为0,就可以把所有的消息持久化到磁盘
2、保证消息至少传递一次:
需要假定给定的nsqd节点不会失败。但是如果出现(客户机超时、断开连接、请求,等等)。会发生多次消费消息,因此执行幂等操作或反欺骗是客户端的责任。
3、接收到的消息是无序的:
各个节点的数据是不共享的,是松散关系,并非是把nsq集群作为一个整体。因此不要依赖传递给消费者的消息顺序。
消费者最终会遍历所有的主题生产者:nsqlookupd旨在最终保持一致,而不是协调保持状态和应答。
FAQ
部署
1、什么是nsqd的推荐拓扑?
- 强烈建议在生成消息的任何服务旁边运行nsqd。
- nsqd是一个相对轻量级的进程,具有有限的内存占用,这使得它非常适合“与他人玩得很好”。
- 好处:有助于将消息流结构化为消费问题而不是生产问题。
- 好处:它基本上为给定主机上的该主题形成了一个独立的,分片的数据仓库。
2、为什么生产者不能使用nsqlookupd来查找要发布给的客户端?
- NSQ推出了一种消费者端发现模型,可以减轻必须告诉消费者在哪里找到所需主题的前期配置负担。
- 但是,它没有提供任何方法来解决服务应该发布到的问题。 这是鸡和蛋的问题,在第一次发布之前主题不存在。
- 通过共同定位nsqd,完全回避了这个问题(服务只是发布到本地nsqd)并允许NSQ的运行时发现系统自然地工作。
nsqd适合在单机中作为工作队列使用?
nsqd 也可以用在单机做工作队列使用,不过定位是分布式环境。
应该启动多少个nsqlookupd ?
- 只有少数几个,具体取决于您的群集大小,nsqd节点和使用者的数量,以及您所需的容错能力。
- 3或5对于涉及多达数百个主机和数千个消费者的部署非常有效。
发布订阅
1、是否需要客户端库来发布消息?
不需要。直接通过http来发布订阅消息
2、为什么强制客户端处理对TCP协议的PUB和MPUB命令的响应?
NSQ的默认操作模式应优先考虑安全性,我们希望协议简单且一致。
3、什么时候会发布或订阅失败?
- topic名称格式不正确(对字符/长度限制)。【请看】
- 消息太大(此限制作为nsqd的参数公开)。
- 该topic正在被删除。
- nsqd正处于干净利落的状态。
- 发布期间与客户端连接相关的任何故障(断开连接…)。 (1,2点是编程出错。3和4比较罕见。5是TCP连接中的问题)
如何避免发布消息时,该主题正被删除
删除topic是一种相对不常见的操作。 如果您需要删除topic,在删除后经过足够长的时间后再发布该topic创建的时间(这时不会造成歧义,会爆发布失败)。
设计与理论
1、如何命名主题(topic)和频道(channel)
- topic名称应描述流中的数据。如:encodes, decodes, api_requests, page_views
- channel名称应描述其消费者所执行的工作。如analytics_increment,spam_analysis
2、单个nsqd可以支持的主题和通道数量是否有任何限制?
没有内置限制。 它仅受nsqd运行的主机的内存和CPU的限制
3、如何向群集发布新主题?
一个主题的第一个PUB或SUB将在nsqd上创建主题。 然后,主题元数据将传播到配置的nsqlookupd。 其他消费者将通过定期查询nsqlookupd来发现此主题。
4、把nsq作为rpc?
可以,但不推荐
组成
守护进程:
- nsqd(接收生产者消息,队列,提供消息给客户端)
- nsqlookupd(管理拓扑信息并提供最终一致性的发现服务)
- nsqadmin(实时查看集群的统计数据,UI管理界面)
单个nsqd可以有很多topic,每个topic可以有很多channel。 channel接收topic的所有消息的副本,在channel上的每个消息在其订户之间分发时启用多播传送,从而实现负载平衡。
设计相关
Speaker Deck展示设计理念,链接
1、数据流
2、消息来回流程
nsqd发消息给客户端,客户端回复FIN或REQ,若nsqd没收到客户端的回复,会重发
3、队列
- topic和channel都是依赖队列queue。
- 队列queue超过阀值会把后面的消息持久化到磁盘
- 支持channel自我检测和恢复
4、消息发布和发现的过程
- 生产者发布消息
- 消息发送到nsqd
- 到nsqlookup注册对应topic
- 消费者发现nsqlookup(定时寻轮[非阻塞事件驱动模型])
- nsq连接所有nsqd,获得消息(为什么连接所有?)
参考: