nsq

nsq深入浅出

Posted by Liangjf on May 26, 2019

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,获得消息(为什么连接所有?)

参考: