> 文档中心 > nsq详细教程1 部署及组件功能测试

nsq详细教程1 部署及组件功能测试

文章目录

  • nsq介绍
  • 环境准备
  • 下载及解压
  • 启动及测试
    • 核心服务启动
    • 功能测试

nsq介绍

NSQ是一个基于Go语言,由bitly公司开源出来的一款简单易用的消息中间件。 官方和第三方开发了众多客户端功能库,如基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、Java客户端nsq-java等。
特点

  1. 支持分布式部署,去中心化,可以避免单点故障,能够具有高容错和HA(高可用)特性。
  2. NSQ支持水平扩展,内置的发现服务简化了在集群中增加节点。
  3. 依赖少,非常容易配置和部署,自带一个管理界面。
  4. 消息可以不持久化,全在内存,宕机消息会丢失。也可配置–mem-queue-size来超出阈值的消息写到硬盘。没有内建的备份机制即使写入硬盘,硬盘坏了数据就丢了。
  5. 保证at least once投递。nsqd没挂的前提下,由于超时,连接断开,重新入队等原因,消息可能多次投递,client自己保证消费消息的操作是具有幂等性的。
  6. nsq消息不保证有序
  7. 其他内容参考官网

基本概念

Topic : 一个topic就是程序发布消息的一个逻辑键,当程序第一次发布消息时就会创建topic。
Channels : channel与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,消费者通过这个特殊的channel读取消息,实际上,在消费者第一次订阅时就会创建channel。Channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。
Messages: 消息构成了我们数据流的中坚力量,消费者可以选择结束消息,表明它们正在被正常处理,或者重新将他们排队待到后面再进行处理。每个消息包含传递尝试的次数,当消息传递超过一定的阀值次数时,我们应该放弃这些消息,或者作为额外消息进行处理。
nsqd: nsqd 是一个守护进程,负责接收,排队,投递消息给客户端。它可以独立运行,不过通常它是由 nsqlookupd 实例所在集群配置的(它在这能声明 topics 和 channels,以便大家能找到)。
nsqlookupd: nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者,并且 nsqd 节点广播话题(topic)和通道(channel)信息。有两个接口:TCP 接口,nsqd 用它来广播。HTTP 接口,客户端用它来发现和管理。注:是消费者查询去哪里取消息,而不是生产者查询生产消息到哪里去
每个nsqd具有与nsqlookupd的长期TCP连接,在该连接上它定期推送其状态。此数据用于通知nsqlookupd将为消费者提供哪些nsqd地址。对于消费者,将公开HTTP /查找端点以进行轮询。
对于nsqlookupd,通过运行多个实例来实现高可用性。它们不直接相互通信,数据被认为最终是一致的。消费者轮询所有已配置的nsqlookupd实例并将响应联合起来。陈旧,不可访问或其他故障节点不会使系统停止运行。
nsqadmin: nsqadmin 是一套 WEB UI,用来汇集集群的实时统计,并执行不同的管理任务。

工具组件

nsq_to_file: 消费指定的话题(topic)/通道(channel),并写到文件中,有选择的滚动和/或压缩文件。
nsq_to_http: 消费指定的话题(topic)/通道(channel)和执行 HTTP requests (GET/POST) 到指定的端点。
nsq_to_nsq: 消费者指定的话题/通道 通过 TCP 重发布消息到目的地 nsqd 。
nsq_stat: 轮询 指定主题/频道的所有生产者并显示汇总统计信息
nsq_tail: 消费指定的主题/通道并写入标准输出 就是打印出来
to_nsq: 通过标准输入(命令行),发送nsq消息 到 topic/channel

官方建议部署架构图
官方推荐将nsqd实例同消息发布者部署在一起。
nsq详细教程1 部署及组件功能测试

环境准备

这里使用1台vmware 虚拟机 centos7.8 来部署集群,完成nsq的测试和学习
服务器地址:192.168.195.10

下载及解压

到官网下载nsq安装包
官网下载地址
这里下载 nsq-1.2.1.linux-amd64.go1.16.6.tar.gz 版本,下载完成后 上传到服务器并解压

[root@localhost nsq]# pwd/root/nsq[root@localhost nsq]# lltotal 0drwxr-xr-x. 2 root wheel 154 Aug 16  2021 bin[root@localhost nsq]# ll bintotal 52176-rwxr-xr-x. 1 root wheel 9150464 Aug 16  2021 nsqadmin-rwxr-xr-x. 1 root wheel 6979584 Aug 16  2021 nsqd-rwxr-xr-x. 1 root wheel 5820416 Aug 16  2021 nsqlookupd-rwxr-xr-x. 1 root wheel 5021696 Aug 16  2021 nsq_stat-rwxr-xr-x. 1 root wheel 5402624 Aug 16  2021 nsq_tail-rwxr-xr-x. 1 root wheel 5513216 Aug 16  2021 nsq_to_file-rwxr-xr-x. 1 root wheel 5455872 Aug 16  2021 nsq_to_http-rwxr-xr-x. 1 root wheel 5472256 Aug 16  2021 nsq_to_nsq-rwxr-xr-x. 1 root wheel 4612096 Aug 16  2021 to_nsq

目录中下各个组件和工具作用见上文

启动及测试

核心服务启动

打开三个终端,通过如下命令启动 nsqlookupd nsqd nsqadmin 三个服务

启动 nsqlookupd 可以看到默认监听 4161 和 4160 端口

[root@localhost nsq]# bin/nsqlookupd [nsqlookupd] 2022/04/15 23:41:52.716040 INFO: nsqlookupd v1.2.1 (built w/go1.16.6)[nsqlookupd] 2022/04/15 23:41:52.719461 INFO: HTTP: listening on [::]:4161[nsqlookupd] 2022/04/15 23:41:52.720876 INFO: TCP: listening on [::]:4160

启动nsqd 服务,这里通过参数 lookupd-tcp-address 指定 上一步启动的 nsqlookupd 服务地址,可以看到 nsqd 监听 4150 和4151 端口

[root@localhost nsq]# bin/nsqd  -lookupd-tcp-address=192.168.195.10:4160 [nsqd] 2022/04/15 23:48:37.219949 INFO: nsqd v1.2.1 (built w/go1.16.6)[nsqd] 2022/04/15 23:48:37.220019 INFO: ID: 856[nsqd] 2022/04/15 23:48:37.220889 INFO: NSQ: persisting topic/channel metadata to nsqd.dat[nsqd] 2022/04/15 23:48:37.222807 INFO: LOOKUP(192.168.195.10:4160): adding peer[nsqd] 2022/04/15 23:48:37.222820 INFO: LOOKUP connecting to 192.168.195.10:4160[nsqd] 2022/04/15 23:48:37.223395 INFO: HTTP: listening on [::]:4151[nsqd] 2022/04/15 23:48:37.223450 INFO: TCP: listening on [::]:4150[nsqd] 2022/04/15 23:48:37.261204 INFO: LOOKUPD(192.168.195.10:4160): peer info {TCPPort:4160 HTTPPort:4161 Version:1.2.1 BroadcastAddress:localhost.localdomain}

启动 nsqadmin 同样通过参数指定 nsqlookupd 服务的地址,看到默认监听 4171

[root@localhost nsq]#  bin/nsqadmin  -lookupd-http-address=192.168.195.10:4161  [nsqadmin] 2022/04/15 23:52:14.183022 INFO: nsqadmin v1.2.1 (built w/go1.16.6)[nsqadmin] 2022/04/15 23:52:14.185103 INFO: HTTP: listening on [::]:4171

功能测试

nsqadmin功能
浏览器访问 http://192.168.195.10:4171/ 可以访问到 nsqadmin 的管理界面 如下:

nsq详细教程1 部署及组件功能测试
可以查看 节点信息、消息计数信息、lookup服务信息 等
nsq详细教程1 部署及组件功能测试
可以在 lookup功能中 创建 topic 和channel
nsq详细教程1 部署及组件功能测试
创建成功
nsq详细教程1 部署及组件功能测试
但是这里提示 在这里创建的topic 不会在nsqd节点上存在,只能在lookup中展示
疑问:那这里创建topic仅仅是为了玩吗?
nsq详细教程1 部署及组件功能测试

发送消息
发送消息时自动创建topic
nsqd已经提供了 发送消息的 http接口,如下发送一套消息到

[root@localhost ~]# curl -d "" http://192.168.195.10:4151/pub?topic=testtopicOK[root@localhost ~]# 

可以看到topic,点击topic 可以看到 里边有消息
nsq详细教程1 部署及组件功能测试
nsq详细教程1 部署及组件功能测试
可以看到 topic中有消息,但是下方有提示:没有channel,消息将在topic中排队直到 有channel被创建

也可以通过 to_nsq工具发送消息

[root@localhost nsq]# bin/to_nsq --topic=testtopic -nsqd-tcp-address=192.168.195.10:415012312312312312312022/04/16 00:36:23 INF    1 (192.168.195.10:4150) connecting to nsqd哈哈哈

消息消费
我们通过上述的nsq_tail 工具 消费并打印 topic中的消息,可以看到 消息被消费并打印到了终端中

[root@localhost nsq]# bin/nsq_tail --lookupd-http-address=192.168.195.10:4161  --topic=testtopic2022/04/16 00:13:11 Adding consumer for topic: testtopic2022/04/16 00:13:11 INF    1 [testtopic/tail445339#ephemeral] querying nsqlookupd http://192.168.195.10:4161/lookup?topic=testtopic2022/04/16 00:13:11 INF    1 [testtopic/tail445339#ephemeral] (localhost.localdomain:4150) connecting to nsqd

在此观察 nsqadmin ,可看到 自动创建了一个channel ,并且消息已经被消费。
nsq详细教程1 部署及组件功能测试
通过 to_nsq发送多条消息,并且看到 都被nsq_tail 消费掉了
nsq详细教程1 部署及组件功能测试
nsq详细教程1 部署及组件功能测试

关闭原来的 nsq_tail 工具,重新打开两个,发现channel也重新创建了,重新发送消息 两个nsq_tail 都可以接收到

nsq详细教程1 部署及组件功能测试

nsq详细教程1 部署及组件功能测试

nsq详细教程1 部署及组件功能测试