go语言nsq单机部署 go语言怎么运行( 四 )


nsqlookupd是守护进程负责管理拓扑信息 。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者 , 并且 nsqd 节点广播话题(topic)和通道(channel)信息
简单的说nsqlookupd就是中心管理服务,它使用tcp(默认端口4160)管理nsqd服务,使用http(默认端口4161)管理nsqadmin服务 。同时为客户端提供查询功能
总的来说,nsqlookupd具有以下功能或特性
官方原话go语言nsq单机部署:是一套 WEB UI,用来汇集集群的实时统计,并执行不同的管理任务
总的来说,nsqadmin具有以下功能或特性
nsqadmin默认的访问地址是
官方原话:nsqd 是一个守护进程,负责接收,排队,投递消息给客户端
简单的说,真正干活的就是这个服务,它主要负责message的收发,队列的维护 。nsqd会默认监听一个tcp端口(4150)和一个http端口(4151)以及一个可选的https端口
总的来说 , nsqd 具有以下功能或特性
这是官方的图,第一个channel(meteics)因为有多个消费者 , 所以触发了负载均衡机制 。后面两个channel由于没有消费者 , 所有的message均会被缓存在相应的队列里,直到消费者出现
这里想到一个问题是,如果一个channel只有生产者不停的在投递message,会不会导致服务器资源被耗尽go语言nsq单机部署?也许nsqd内部做了相应处理,但还是要避免这种情况的出现
了解nsqlookupd,nsqd与客户端中消费者和生产者的关系
消费者有两种方式与nsqd建立连接
生产者必须直连nsqd去投递message(网上说,可以连接到nsqlookupd,让nsqlookupd自动选择一个nsqd去完成投递,但是我用Producer的tcp是连不上nsqlookupd的,不知道http可不可以…) , 
这里有一个问题就是如果生产者所连接的nsqd炸了,那么message就会投递失败,所以在客户端必须自己实现相应的备用方案
执行完后检查godep是否已经安装在bin目录下,一般都会自动安装,如果没有,用go install手动安装下
如果安装成功,bin目录里就会出现一大堆nsq_…开头的可执行文件
nsqd是一个独立的服务,启动一个nsqd就可以完成message的收发,启动一个单机的nsqd,很简单
客户端可以使用http , 也可以使用tcp,这里我使用是官方的go-nsq包做客户端,使用tcp进行message的收发
//Nsq发送测试
//Nsq接收测试
如何将用go语言开发的服务器程序部署到docker部署简单 。Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖 。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具 , 完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担 。这和 Python 有着巨大的区别 。由于历史的原因,Python 的部署工具生态相当混乱【比如 setuptools, distutils, pip, buildout 的不同适用场合以及兼容性问题】 。官方 PyPI 源又经常出问题,需要搭建私有镜像 , 而维护这个镜像又要花费不少时间和精力 。
并发性好 。Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题 。单个 Go 应用也能有效的利用多个 CPU 核 , 并行执行的性能好 。这和 Python 也是天壤之比 。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁 GIL 的原因,多线程的 Python 程序并不能有效利用多核 , 只能用多进程的方式部署;如果用标准库里的 multiprocessing 包又会对监控和管理造成不少的挑战【我们用的 supervisor 管理进程,对 fork 支持不好】 。部署 Python 应用的时候通常是每个 CPU 核部署一个应用,这会造成不少资源的浪费 , 比如假设某个 Python 应用启动后需要占用 100MB 内存,而服务器有 32 个 CPU 核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源 。

推荐阅读