编者按: 此篇文章转载自 http://www.baiyuxiong.com/?p=873,内容陈旧,仅供查阅。
官方文档见: http://bitly.github.io/nsq/overview/quick_start.html。
NSQ 是由知名短链接服务商 bitly 用 Go 语言开发的实时消息处理系统, 具有高性能、高可靠、无视单点故障等优点, 是一个非常不错的新兴的消息队列解决方案。
nsg 易于配置和部署, 所有参考都通过命令行指定, 编译好的二进制文件, 没有其它依赖项。而且支持多种消息格式。
源码下载地址: https://github.com/bitly/nsq
本系列文档下载的源码为 0.2.27 版本。
为更好的理解源码, 最理想的起步当然是先了解 nsq 的用法。所以接下来会先讲解 nsq 的安装、使用。
1、安装 golang 环境。
2、安装 godep, 在命令行执行:
go get github.com/kr/godep
如果在使用 go get 安装过程中报错, 可以参考另一篇文章: 关于 go get 安装 git golang 项目时报错的处理办法
安装之后, 在 %GOPATH%/bin 目录下会看到有 godep.exe, 然后记得将 %GOPATH%/bin 配置到环境变量里, 以后在命令行就可以直接输入 godep 命令来执行一些操作了。
3、安装 assert, 在命令行执行:
go get github.com/bmizerany/assert
4、接下来开始获取 nsg 的代码并编译。
在命令行执行:
godep get github.com/bitly/nsq/...
注意: 后面有三个点不能少。
执行之后在 %GOPATH%/bin
下会有很多 nsq 打头的 exe 文件存在。
至此安装就结束了。
使用 nsq
总共需要打开五个命令行窗口。
第一个执行:
nsqlookupd
第二个执行:
nsqd --lookupd-tcp-address=127.0.0.1:4160
第三个执行:
nsqadmin --lookupd-http-address=127.0.0.1:4161
第四个执行:
curl -d "hello world 1" "http://127.0.0.1:4151/put?topic=test"
第五个执行:
nsq_to_file --topic=test --output-dir=F:\tmp --lookupd-http-address=127.0.0.1:4161
这个命令中的 output-dir
参数, 表示数据文件保存在目录, 可以根据需要修改。
再回到第四个窗口, 执行
curl -d "hello world 2" "http://127.0.0.1:4151/put?topic=test"
curl -d "hello world 3" "http://127.0.0.1:4151/put?topic=test"
经过这一串操作后, 可以开始看成果了:
浏览器访问: http://127.0.0.1:4171/,
可以看到数据统计分析的页面。
打开 output-dir 参数设置的目录, 如本例中的 F:\tmp, 打开里面的一个记事本文件, 看到有三行:
hello world 1
hello world 2
hello world 3
至此, 安装和使用就结束了。
到目前为止, 我们还停留在知其然, 不知其所以然的地步。完全搞不懂上面这些使用的命令行在干什么, 也没理解 nsq 的使用价值在哪里。不过本篇呢, 还是要结束了, 欲知后事如何, 且听下回分解。
上一篇 go 语言 nsq 源码解读 - 基本介绍 介绍了最基本的 nsq 环境搭建及使用。在最后使用时, 我们用到了几个命令: nsqlookupd、nsqd、nsqadmin、curl 及 nsq_to_file, 并看到用 curl 命令写入的几个 “hello world” 被 nsq_to_file 命令保存在了硬盘文件中。本节中, 将讲述这几个命令的作用、用法。
官方文档解释见: http://bitly.github.io/nsq/components/nsqlookupd.html
用官方话来讲是: nsqlookupd 管理拓扑信息, 客户端根据特定的 topic 查询 nsqlookupd 来发现 nsqd 生产者及 nsqd 广播 topic 和 channel 信息。比较难懂, 所以接下来, 用通俗的话来解释。
首先讲点别的东西, 用过 linux 的同学可能会发现, linux 下很多应用, 比如 apache、mysql、ftp 等它们的服务名称都是在 d 结尾的。如:
apache -> httpd
mysql -> mysqld
vsftp -> vsftpd
最后的结尾 d 是 Daemon 的意思, 守护进程, 这种进程不会因为终端窗口关闭就停止执行。比如 apache, 执行 service httpd start 后, apache 就启动了, 终端关掉后, apache 仍然在后台运行。
好了, 现在你会发现, 我们的 nsqlookupd 和 nsqd 也是在 d 结尾的, 这就暗示他们可能是守护进程, 而事实上也确实是这样。
nsqlookupd 就是类似 apache 一样的一个后台服务, 它可以理解为整个 nsq 系统的神经中枢, 启动以后, 它默认会同时监听两个端口, 在 4160 端口, 建立一个 tcp server, 用于和 nsqd 进行数据沟通。在 4161 上呢, 会建立一个 http server, 用于和 nsqadmin 进行数据交互。
官方文档地址: http://bitly.github.io/nsq/components/nsqd.html
用官方话解释为: nsqd 接收、队列、发送消息到客户端。
上一讲中, 执行的第二个命令: nsqd –lookupd-tcp-address=127.0.0.1:4160
表示启动一个 nsqd 服务, 同时告诉这个服务, nsqlookupd 的地址在 127.0.0.1:4160。4160 端口, 也就是 nsqlookupd 监听的 tcp erver 的地址。有了这个地址后, nsqd 就可以和 nsqlookupd 地建立连接, 然后做数据交互。同时呢, nsqd 自己会默认监听 4151 端口, 接收以 http 方式发送来的消息数据。
官方文档见: http://bitly.github.io/nsq/components/nsqadmin.html
提供一个浏览器可访问的 web 页面, 用于实时查看集群状态和执行一些管理操作。
上一讲中, 第三个命令: nsqadmin –lookupd-http-address=127.0.0.1:4161
表示启动 nsqadmin, 同时告诉这个服务, nsqlookupd 监听的 http 地址在 127.0.0.1:4161, 这样, nsqadmin 也会和 nsqlookupd 建立连接, 进行数据交互。而 nsqadmin 本身会监听 4171 端口, 提供一个 web 服务, 供浏览器访问, 查看数据。所以在上一讲, 最后我们通过访问 http://127.0.0.1:4171 / 查看统计数据。
这个应该都很熟悉的命令, 它可以发起网络请求到指定的 URL。可以参考网址:
http://blog.51yip.com/linux/1049.html
上一讲中:
curl -d “hello world 1” “http://127.0.0.1:4151/put?topic=test”
表示向网址 http://127.0.0.1:4151/put?topic=test 发起 POST 请求, 参数为 hello world 1, 这 4151 端口, 刚好是 nsqd 监听的端口, 也就是说 nsqd 可以接口网络发来的信息, 并放入队列保存起来, 供消息的 “消费者” 来取出数据并处理。所以前面介绍 nsqd 的时候提到 “nsqd 接收、队列、发送消息到客户端。”。
这是 nsq 提供一个简单的消息 “消费者”, 他把某个指定 “topic” 下的数据存在指定的文件中。
上一讲的命令:
nsq_to_file –topic=test –output-dir=F:\tmp –lookupd-http-address=127.0.0.1:4161
表示把指定的话题 test 下的数据, 放在目录 F:\tmp 下面。所以可以看到文件中保存了三个 hello world, 因为我们向 topic=test 的 URL curl 了三次 hello world.
同时大家可能会注意到, nsq_to_file 指定的最后一个参数, lookupd-http-address 的 4161 端口是 nsqlookupd 的地址, 不是 nsqd 的, 而我们 curl 发消息是发到 nsqd 的 4151 端口了, 这是什么原因呢?
源码我也没读完, 呵呵, 所以呢, 目前猜测是因为 nsqlookupd 维护着所有 nsqd 的状态。知道 nsqlookupd 的地址后, 就可以问 nsqlookupd 要所有的 nsqd 的信息了。
补充一个图:
nsq
举例
到此为止, 几个命令都说完了。为方便理解, 接下来讲个形象的例子。
每产生一个 nsqd, 都要连到 nsqlookupd 汇报状态, 及定时发送心跳包。对应的: 每个人出生或者过世, 都要到户籍办去上户或销户, 而平时有生之年, 你可能还要偶尔去去户籍办, 出个户籍证明之类的。
管理者可以通过 nsqadmin 来查看统计数据, 同时做一些管理操作。对应的, 人品普查的时候, 可以通过公安局来查看, 各地区的人口数、性别比例、年龄分布等等。
例子不太恰当, 不过对理解也有些帮助, 就放在这里了。
本篇就到这里。文章如有错误, 欢迎指正、留言。
谢谢。