之前知乎上在go有关学习经验中看到有人推荐可以通过学习NSQ来学习go语言,并且还能顺道了解消息队列的设计,可谓一举两得。所以去了解了下NSQ,发现截止本文编写时间,NSQ在github上已经累积了17.7K 的star,发现比大家经常用到的kafka,rabbitmq的star还要高。汗,看来自己真是孤陋寡闻了。
就从基本使用开始入手吧
1.克隆源代码,并切换到dev分支
https://github.com/nsqio/nsq.git
这儿使用go mod管理 记得装好依赖
2.应用包app
本文主要介绍安装使用,所以主要看app包中
将会用到这四个包,其中nsqlookupd 个人理解为连接消息生产端与消息服务端的中间程序,用来保证一致性,类似于zookeeper。nsqd个人理解为接收消息推送,以及发送消息的组件,可以理解为类似kafka。nsq_to_ xx个人理解为消费消息的组件,nsqadmin则顾名思义为管理程序,可以用来查看message,topic,channel等情况。
所以我们依次启动nsqqlookupd,nsqd,nsq_to_http,nsqadmin。
2.1 启动nsqlookupd
可以看到控制打印
通过打印我们可以知道其监听了两个端口,http 4161,tcp 4160 。
2.2启动NSQD
即消息推送组件
由于其依赖nsqlooupd,所以启动参数记得加上 --lookupd-tcp-address=127.0.0.1:4160 即2.1中监听的tcp端口
启动成功后控制台应该打印如上,这儿注意也开启了 http端口 4151,tcp端口 4150
2.3启动消费组件
这儿为了方便就直接用nsq_to_http组件
启动必要参数只有三个,一个是消费topic 我们使用nsq_my ,一个是连接我们的中间组件即nsqlookupd的地址,一个是消费的webapi接口,
--topic nsq_my --lookupd-http-address 127.0.0.1:4161 --get http://localhost:8888/msg?msg=%s
这儿注意--get即代表get请求,也可以使用post请求,即--post 但是使用post请求注意加上 --content-type
http://localhost:8888/msg?msg=%s即自己的api服务,这儿可以建一个web服务
package main import ( "github.com/gin-gonic/gin" "web_application/controller/animal" "web_application/controller/nsq" ) func main() { ctx :=gin.Default() ctx.GET("/msg",nsq.Consumer) ctx.Run(":8888") }
package nsq import ( "github.com/gin-gonic/gin" "log" ) func Consumer(con *gin.Context) { msg := con.Query("msg") log.Printf("成功获取到消息: %s ",msg) }
内容很简单,就是消费并打印即可,监听端口为8888,拦截/msg 的get请求地址(记得启动web服务)
启动nsq_to_http成功后控制台会打印如下
这儿会报错,提示没有nsq_my这个topic 这是因为我们还没创建
测试
按照官方测试用例我们可以测试消息发送, 像topic 为nsq_my发送一条消息this is the fisrt message 如果这个topic不存在则NSQ会自动创建
curl -d 'this is the fisrt message' 'http://127.0.0.1:4151/pub?topic=nsq_my' 记住这儿的4151即nsqd组件监听的http端口
会发现我们创建的web服务已经成功消费到了数据
到此,NSQ的消息推送与消费就已经成功了
2.4 nsqadmin
之前提到了nsqadmin,这是nsq官方出的web界面管理器,方便我们查看消息消费情况,启动方式也很简单。找到nsqadmin包下的main方法并启动
不过既然是管理器,其肯定也要在启动参数前连接到我们的nsqlookupd中间件才行 --lookupd-http-address=127.0.0.1:4161
启动成功后控制台打印会如下
可以看到其监听了4171的http端口,所以我们直接访问localhost:4171,可以看到我们刚才创建的topic,其他两个是我之前创建的。
点进去后可以看到消息消费情况
到此nsq的基本操作就结束了,可以看到主要的组件有nsqlookupd,nsqd,nsq_to_xx,分别对应中间件,生产组件,消费组件。可以发现使用起来还是很简单的,直接支持rest api 推送消息和消费消息。