一. nsq介绍
nsq介绍
NSQ是一个基于Go语言,由bitly公司开源出来的一款简单易用的消息中间件。 官方和第三方开发了众多客户端功能库,如基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、Java客户端nsq-java等。
特点
支持分布式部署,去中心化,可以避免单点故障,能够具有高容错和HA(高可用)特性。
NSQ支持水平扩展,内置的发现服务简化了在集群中增加节点。
依赖少,非常容易配置和部署,自带一个管理界面。
消息可以不持久化,全在内存,宕机消息会丢失。也可配置–mem-queue-size来超出阈值的消息写到硬盘。没有内建的备份机制即使写入硬盘,硬盘坏了数据就丢了。
保证at least once投递。nsqd没挂的前提下,由于超时,连接断开,重新入队等原因,消息可能多次投递,client自己保证消费消息的操作是具有幂等性的。
nsq消息不保证有序
基本概念
Topic : 一个topic就是程序发布消息的一个逻辑键,当程序第一次发布消息时就会创建topic。
Channels : channel与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,消费者通过这个特殊的channel读取消息,实际上,在消费者第一次订阅时就会创建channel。Channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。
producer / consumer 消息的生产与发送者,这是用户功能具体实现的地方。每当一个消息由生产者发送到整个 NSQ 网络中,会有一个对应 consumer 负责与 NSQ 通信并处理这个消息。
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 docker 部署
拉取官方镜像
docker pull nsqio/nsq
Using default tag: latest
latest: Pulling from nsqio/nsq
29291e31a76a: Pull complete
b44c125007f5: Pull complete
78faf4072458: Pull complete
a12f7a4c50c9: Pull complete
9c80996c86b5: Pull complete
Digest: sha256:9e10df8ff8cd60f99f5eefebcd5e913b9e1ea3d76767894e6c7bb8fc725b73b2
Status: Downloaded newer image for nsqio/nsq:latest
docker.io/nsqio/nsq:latest
nsq 主要有三个组件: nsqlookupd, nsqd, nsqadmin。这三个组件都包含在 nsqio/nsq 镜像中, 每一个组件都可以通过指定组件名的方式去启动,启动命令的形式如下:docker run nsqio/nsq /command
拉取基础镜像 docker pull nsqio/nsq
部署nsqlookupd
docker run --name lookupd -p 4160:4160 -p 4161:4161 -d nsqio/nsq /nsqlookupd
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbf48d2583a1 nsqio/nsq "/nsqlookupd" 39 seconds ago Up 38 seconds 4150-4151/tcp, 4170-4171/tcp, 0.0.0.0:4160-4161->4160-4161/tcp nsqlookupd
说明:
- -p 是映射端口
- -d 是后台运行容器
- /nsqlookupd 就是启动命令
部署nsqd
首先通过ifconfig获取本机的ip地址
ifconfig
本机为192.168.1.39
nsq docker启动
docker run --name nsqd -p 4150:4150 -p 4151:4151 -d nsqio/nsq /nsqd --broadcast-address=192.168.1.39 --lookupd-tcp-address=192.168.1.39:4160 --data-path=/data
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41eba4855824 nsqio/nsq "/nsqd --broadcast-a…" 7 seconds ago Up 6 seconds 4160-4161/tcp, 0.0.0.0:4150-4151->4150-4151/tcp, 4170-4171/tcp nsqd
bbf48d2583a1 nsqio/nsq "/nsqlookupd" 10 minutes ago Up 10 minutes 4150-4151/tcp, 4170-4171/tcp, 0.0.0.0:4160-4161->4160-4161/tcp nsqlookupd
持久化保存 nsqd 数据 使用/data 参数:
--data-path=/data
部署nsqadmin
docker run -d --name nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin --lookupd-http-address=192.168.1.39:4161
访问 http://192.168.1.39:4161 就可以查看 nsq系统详情了
http接口
提供了 各种http接口供调用,详情参考官网,这里仅做个别测试
/nodes :显示集群节点信息
/info :显示版本信息
/ping :验证服务状态
/topics:显示所有的topic
/channel/create:创建channel
/channel/delete:删除channel
/topic/create:创建topic
/topic/delete:删除topic
/lookup :查找指定topic 的生产者
http://192.168.1.39:4161/nodes
访问http://192.168.1.39:4171 可以访问nsqadmin 的首页
三. 创建topic
curl -d 'hello world ' 'http://127.0.0.1:4151/pub?topic=test'
发送一个内容是hello world 的消息到test topic中
调用http://192.168.1.39:4161/topics
{"topics":["test","test1"]}