一直也想用Go来写点什么项目,但github上趴了很久最终也没下决心去实际行动,也是碰巧有一天看到一篇文章介绍NSQ实时消息队列的源码分析,让我有了也要去深入学习的冲动。。。学习大神的代码思想和整体架构
话说我一直用着世界上最好的语言PHP,总想深入做个源码分析,每次都是刚开始就止步于此。。。也想去看看kafka的源码,但是,但可是它使用Scala语言编写,想看它还得重头来过。
当当当。。。重点来了
当Go出现让一切变得特别不一样哈,咱也可以做点高大上的事情了 嚯嚯,难道我这是跪久了,是Golang让我也能站起来,翻身农奴把歌唱赶脚。。。
废话不说了开篇先走一遍流程 NSQ基本介绍
基本介绍
NSQ是由知名短连接服务商bitly用Go语言开发的实时消息处理系统,具有高性能、高可靠、无视单点故障等优点,是一个非常不错的新兴的消息队列解决方案。NSQ现在发展很快,已有多种语言的客户端,GO和Python版本的客户端是官方出的,比较给力。
目前NSQ是一个成熟的方案,已在大规模生产环境下应用的产品。
开始进入状态
注意事项
1. 概述
NSQ提供了三大组件以及一些工具,三大组件为:
1.nsqd NSQ主要组件,用于存储消息以及消息分发。 2.nsqlookupd 用于管理nsqd集群拓扑,提供查询nsqd主机地址以及服务最终一致性 3.nsqadmin 提供了常规管理以及查询集群中topc/channel/node等
2. 准备工作
3. 源码目录结构
├── Dockerfile # docker脚本 ├── Gopkg.lock ├── Gopkg.toml ├── LICENSE ├── Makefile ├── README.md ├── apps # 项目应用的业务代码(暂时可以这么理解) ├── bench ├── bench.sh ├── contrib ├── coverage.sh ├── dist.sh ├── fmt.sh ├── go.mod # go modules 源码依赖 ├── go.sum #提供了安全性校验(自动生成可以不用管它) ├── internal # 内部使用的相关包/组件等 ├── nsqadmin # 用于管理以及查看集群中的topic、channel、node等信息 ├── nsqd # NSQ主要组件,用于存储消息以及分发消息 ├── nsqlookupd # 用于管理nsqd集群拓扑,提供查询nsqd主机地址服务以及服务的最终一致性 ├── test.sh 测试脚本 └── travis.sh
后面会对相关目录逐一展开讲解,主要分析目录:apps、nsqadmin、nsqd、nsqlookupd
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq$ tree apps/ apps/ ├── nsq_stat │ └── nsq_stat.go ├── nsq_tail │ └── nsq_tail.go ├── nsq_to_file │ ├── file_logger.go │ ├── nsq_to_file.go │ ├── options.go │ ├── strftime.go │ └── topic_discoverer.go ├── nsq_to_http │ ├── http.go │ ├── nsq_to_http.go │ └── nsq_to_http_test.go ├── nsq_to_nsq │ └── nsq_to_nsq.go ├── nsqadmin │ └── main.go ├── nsqd │ ├── README.md │ ├── main.go │ ├── main_test.go │ └── options.go ├── nsqlookupd │ ├── README.md │ └── main.go └── to_nsq ├── README.md └── to_nsq.go
- apps目录:应用程序入口相关文件
- 后续重点先展开介绍app/nsqd目录来带动其他包
- nsqd是一个守护进程,负责接收、排队、投递消息给客户端,并不保证消息的严格顺序,nsqd默认监听一个tcp端口(4150),一个http端口(4151)以及一个可选端口https。。。(这章先带动一下即将要展开分析的nsqd介绍)
有兴趣的各位现在就可以手动利用源码文件来编译一下nsqd,下面我逐一跑跑一次.按照我步骤来绝对能跑起来,我也会把遇到的坑贴出来(其实不是坑,是我学艺不精,对go还是半知半解)。
cd apps/nsqd zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go build main.go options.go zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ ll total 21736 drwxr-xr-x 7 zhangliang staff 224 12 21 23:24 ./ drwxr-xr-x 11 zhangliang staff 352 12 21 22:33 ../ -rw-r--r-- 1 zhangliang staff 146 12 21 22:33 README.md -rwxr-xr-x 1 zhangliang staff 11103212 12 21 23:24 main* -rw-r--r-- 1 zhangliang staff 1820 12 21 22:33 main.go -rw-r--r-- 1 zhangliang staff 711 12 21 22:33 main_test.go -rw-r--r-- 1 zhangliang staff 8193 12 21 22:33 options.go zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ ./main [nsqd] 2019/12/21 23:24:58.588553 INFO: nsqd v1.2.1-alpha (built w/go1.11.4) [nsqd] 2019/12/21 23:24:58.588635 INFO: ID: 210 [nsqd] 2019/12/21 23:24:58.588961 INFO: NSQ: persisting topic/channel metadata to nsqd.dat [nsqd] 2019/12/21 23:24:58.590178 INFO: TCP: listening on [::]:4150 [nsqd] 2019/12/21 23:24:58.590253 INFO: HTTP: listening on [::]:4151
编译为二进制文件在运行main
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go run main.go options.go [nsqd] 2019/12/21 23:27:10.553048 INFO: nsqd v1.2.1-alpha (built w/go1.11.4) [nsqd] 2019/12/21 23:27:10.553115 INFO: ID: 210 [nsqd] 2019/12/21 23:27:10.553841 INFO: NSQ: persisting topic/channel metadata to nsqd.dat [nsqd] 2019/12/21 23:27:10.554708 INFO: TCP: listening on [::]:4150 [nsqd] 2019/12/21 23:27:10.554824 INFO: HTTP: listening on [::]:4151
直接只用go run运行
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go run ./ [nsqd] 2019/12/21 23:28:19.923649 INFO: nsqd v1.2.1-alpha (built w/go1.11.4) [nsqd] 2019/12/21 23:28:19.923720 INFO: ID: 210 [nsqd] 2019/12/21 23:28:19.924537 INFO: NSQ: persisting topic/channel metadata to nsqd.dat [nsqd] 2019/12/21 23:28:19.925513 INFO: TCP: listening on [::]:4150 [nsqd] 2019/12/21 23:28:19.925887 INFO: HTTP: listening on [::]:4151
或者使用go run ./,这样就不用使用 go run main.go options.go
结束
嚯嚯,终于迈出了第一步,开遍和准备工作搞定了,相信跟着我的脚步您现在可以把nsqd编译出来并已运行。
后续文章将正式开始nsqd源码分析(其实网上有很多源码分析,我这个系列重点是分析每行代码并添加上注释,来看看大牛的代码思想和整体架构)由于本人技术有限,我基本上是手动测试源码,看牛人文章,分析、摘录、集合已分析出来的思路,采用大白话方式书写。。。望各位看官见谅
我的博客: http://shuchimao.com/