NSQ介绍及搭建

NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。

官方文档 http://nsq.io/overview/quick_start.html

设计

一个 nsqd 实例被设计成一次处理多个数据流。流被称为 “ 话题 (topics)”,话题具有一个或多个 “ 通道 (channels)”。每个通道都收到一个话题的所有消息的副本。在实践中,通道映射到消费话题的下游服务。

话题和通道未被配置为先验。话题是通过发布到命名话题或通过订阅命名话题上的通道首次使用而创建的。通过订阅指定的通道首次使用通道。

话题并将所有缓冲数据彼此独立地通道,从而防止消费者慢于其他通道的积压(同样适用于话题级别)。

通道可以并且通常具有连接的多个客户端。假设所有连接的客户端处于准备好接收消息的状态,每个消息将被传递给随机客户端。

总而言之,消息是从话题 - > 通道(每个通道接收该话题的所有消息的副本)而是从信道 - 消费者均匀分布的消息(每个消费者接收该通道的一部分消息)。

NSQ 还包括一个帮助应用程序,nsqlookupd它提供一个目录服务,消费者可以在其中查找 nsqd 提供他们有兴趣订阅的话题的实例的地址。在配置方面,消费者与生产者脱钩(他们只需要知道哪里可以联系到nsqlookupd彼此的常见情况),从而减少复杂性和维护。

在较低的级别,每个nsqd都有一个长期的 TCP 连接nsqlookupd,它周期性地推动其状态。该数据用于通知哪些 nsqd 地址 nsqlookupd 将提供给消费者。对于消费者,一个 HTTP /lookup 端点被公开用于轮询。

特性

  • 支持无 SPOF (单点故障) 的分布式拓扑
  • 水平扩展 ( 没有中间件,无缝地添加更多的节点到集群 )
  • 低延迟消息传递 ( 性能 )
  • 结合负载均衡和多播消息路由风格
  • 卓越的流量(高吞吐量)和面向工作的(低吞吐量)工作负载
  • 主要是内存中 ( 除了高水位线消息透明地保存在磁盘上 )
  • 运行时发现服务,供消费者查找生产者(nsqlookupd )
  • 传输层安全性 (TLS)
  • 数据格式不可知
  • 一些依赖项 ( 容易部署 ) 和健全的,有界,默认配置
  • 任何语言都有简单 TCP 协议支持客户端库
  • 用于统计信息,管理操作和生产者的 HTTP 接口(无需发布客户端库)
  • 为实时检测集成了 statsd
  • 健壮的集群管理界面 (nsqadmin)

担保

消息不可持久化(默认)

虽然系统支持消息持久化存储在磁盘中(通过 --mem-queue-size ),不过默认情况下消息都在内存中 .

如果将 --mem-queue-size 设置为 0,所有的消息将会存储到磁盘。我们不用担心消息会丢失,nsq 内部机制保证在程序关闭时将队列中的数据持久化到硬盘,重启后就会恢复。

NSQ 没有内置的复制机制,却有各种各样的方法管理这种权衡,比如部署拓扑结构和技术,在容错的时候从属并持久化内容到磁盘。

消息最少会被投递一次

这个假设成立于 nsqd 节点没有错误。

因为各种原因,消息可以被投递多次(客户端超时,连接失效,重新排队,等等)。由客户端负责操作。

接收到的消息是无序的

不要依赖于投递给消费者的消息的顺序。

和投递消息机制类似,它是由重新队列 (requeues),内存和磁盘存储的混合导致的,实际上,节点间不会共享任何信息。

它是相对的简单完成疏松队列,(例如,对于某个消费者来说,消息是有次序的,但是不能给你作为一个整体跨集群),通过使用时间窗来接收消息,并在处理前排序(虽然为了维持这个变量,必须抛弃时间窗外的消息)。

消费者最终会找出所有 Topic 的生产者

发现服务(nsqlookupd )旨在最终保持一致。 nsqlookupd 节点不协调维护状态或应答查询。

快速开始

下面的步骤将通过推送 (publishing)、消费 (consuming) 和归档 (archiving) 消息到本地磁盘,在本地环境演示一个小型的 NSQ 集群

  1. 在一个 shell 中,启动nsqlookupd
$ nsqlookupd
  1. 在另一个 shell 中,开始nsqd
$ nsqd --lookupd-tcp-address=127.0.0.1:4160
  1. 在另一个 shell 中,开始nsqadmin
$ nsqadmin --lookupd-http-address=127.0.0.1:4161
  1. 发布初始消息(也在集群中创建话题):
$ curl -d 'hello world 1' 'http://127.0.0.1:4151/pub?topic=test'
  1. 最后,在另一个 shell 中,开始nsq_to_file
$ nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161
  1. 发布更多信息到nsqd
$ curl -d 'hello world 2' 'http://127.0.0.1:4151/pub?topic=test'
$ curl -d 'hello world 3' 'http://127.0.0.1:4151/pub?topic=test'

验证事情按预期工作,在网络浏览器中打开http://127.0.0.1:4171/ 以查看nsqadminUI 并查看统计信息。另外,检查test.*.log写入的日志文件()的内容 /tmp。

这个教程中最重要的是:nsq_to_file ( 客户端 ) 没有明确地指出 test 话题从哪里产生,它从 nsqlookupd 获取信息,即使在消息推送之后才开始连接 nsqd,消息也并没有消失。

组成

NSQ 由 3 个守护进程组成:

  • nsqd 是接收、队列和传送消息到客户端的守护进程。
  • nsqlookupd 是管理的拓扑信息,并提供了最终一致发现服务的守护进程。
  • nsqadmin 是一个 Web UI 来实时监控集群(和执行各种管理任务)。

在 NSQ 数据流建模为一个消息流和消费者的树。一个话题(topic )是一个独特的数据流。一个 通道(channel ) 是消费者订阅了某个 话题 的逻辑分组。

单个 nsqd 可以有很多的话题,每个话题可以有多通道。一个通道接收到一个话题中所有消息的副本,启用组播方式的传输,使消息同时在每个通道的所有订阅用户间分发,从而实现负载平衡。

nsqd

nsqd 是一个守护进程,负责接收,排队,投递消息给客户端。

它可以独立运行,不过通常它是由 nsqlookupd 实例所在集群配置的(它在这能声明 topics 和 channels,以便大家能找到)。

它在 2 个 TCP 端口监听,一个给客户端,另一个是 HTTP API。同时,它也能在第三个端口监听 HTTPS。

nsqd --lookupd-tcp-address=127.0.0.1:4160 --http-address="0.0.0.0:4151"
--tcp-address="0.0.0.0:4150"

nsqlookupd

nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic )的生产者,并且 nsqd 节点广播话题(topic )和通道(channel )信息。

有两个接口:TCP 接口,nsqd 用它来广播。HTTP 接口,客户端用它来发现和管理。

nsqlookupd --http-address="0.0.0.0:4161" --tcp-address="0.0.0.0:4160"

nsqadmin

nsqadmin 是一套 WEB UI,用来汇集集群的实时统计,并执行不同的管理任务。

nsqadmin --lookupd-http-address=127.0.0.1:4161 --http-address="0.0.0.0:4171"

工具

nsq_stat

为所有的话题(topic )和通道(channel )的生产者轮询 /stats,并显示统计数据

nsq_stat --lookupd-http-address=127.0.0.1:4161 --channel=mxxx --topic=test

nsq_tail

消费指定的话题(topic ) / 通道(channel ),并写到 stdout ( 和 tail(1) 类似 )。

nsq_tail --lookupd-http-address=127.0.0.1:4161 --topic=test

nsq_to_file

消费指定的话题(topic ) / 通道(channel ),并写到文件中,有选择的滚动和 / 或压缩文件。

nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161

nsq_to_http

消费指定的话题(topic ) / 通道(channel )和执行 HTTP requests (GET/POST) 到指定的端点。

nsq_to_http --topic=test --post=demo.demo.com --lookupd-http-address=127.0.0.1:4161

nsq_to_nsq

消费者指定的话题 / 通道和重发布消息到目的地 nsqd 通过 TCP。

nsq_to_nsq --topic=test --nsqd-tcp-address=127.0.0.1:4151 --lookupd-http-address=127.0.0.1:4161

to_nsq

采用 stdin 流,并分解到新行(默认),通过 TCP 重新发布到目的地 nsqd。

to_nsq --topic=test --nsqd-tcp-address=127.0.0.1:4151
0%