看到好多招聘JD上都要求要有高并发,消息队列的经验,但是咱又没有咋办?那就只好摸着石头过河了呗,找个消息队列来实践一下.
由于我喜欢用golang,所以在对比了NSQ和kafka后,鉴于NSQ是golang写的,直接编译为binary,所以部署会方便一些,所以我们就来探索一下NSQ.
去NSQ的官网https://nsq.io/deployment/installing.html把binary下载下来,解压后得到一套的二进制文件,我在windows下演示,linux应该是差不多的.
-
第一步,
nsqlookupd
,启动守护进程,其实从后面可以知道nslookupd是一个管理节点之间拓扑关系的守护进程,所有后面带有后缀d
- 说明当前这个进程占用了4160端口给http使用,在4160端口给tcp协议使用
-
第二步
- 另起一个终端,
nsqd --lookupd-tcp-address=127.0.0.1:4160
正是上一步我们观察到的tcp协议占用的4160端口 - 而
nsqd
则是真正的接受,入队,分发消息的守护进程,也就是消息队列的核心功能 - 而在这里我们就能发现nsqd连接到了之前
nsqlookupd
监听的4160端口,继而去监听4151端口
- 另起一个终端,
-
第三步
nsqadmin --lookupd-http-address=127.0.0.1:4161
- 此时我们又发现了
nsqadmin
又去监听了4171
端口,这个是什么呢,就是nsq的web ui监控界面 - 打开
localhost:4171
就能看见管理界面了 - 可以发现刚开始没有任何topic,也没有处理过任何消息的,所以counter也是0
接下来 ,我们往里面塞东西看看,
curl -d 'hello world 1' 'http://127.0.0.1:4151/pub?topic=test'
,注意在win下,需要把hello world中的空格更换为横线,总之不要留空格,否则curl命令会去误以为去解析域名而报错,而且要去掉URL
的引号- 此时出现了url中设置的topic为test的项目,
-
此时再跑
nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161
-
/tmp更换消息需要存储的路径
-
为什么需要这个功能呢,因为大流量的时候可能机器会挂掉,但是已经进来的消息不能丢啊,最好还是要进到磁盘里面,后面再继续读取出来,继续出来没处理完的消息
这个时候也能发现指定路径下下面生成了log文件,也就是我们从内存里面同步到磁盘的消息,同时,还能发现,这个nsq可能是每个小时都会同步一次,生成一次log文件,(虽然我们还并没有看过详细文档和源码,只是猜测??)
按照官网的操作,发现这个时候,再往里面塞消息,这个时候就能得到发现新加的消息自动的同步到了本地的磁盘,而且计数器告诉我们已经处理了条消息.
消息队列的用处很多很多,此处不赘述,后续再继续讨论,谢谢大家.