文章目录
前言
nsq的整体架构图
部件:nsqd
部件:nsqlookupd
部件:nsq连接库
部件:nsqadmin
上两篇博客
centos环境搭建nsq单点_YZF_Kevin的博客-CSDN博客
linux环境搭建nsq集群_YZF_Kevin的博客-CSDN博客
我们讲了nsq是什么,有什么用,它的内部组成部件,下载,单点搭建,集群搭建等等
这一篇博客,我们开始讲nsq的整体架构、运行时的总体流程图,各个部件的作用
详细解释下
最上方的nsqd1,nsqd2,nsqd3,nsqd4都是nsqd的单个节点,至少需要开一个,也可以根据实际需要开多个
nsqd是整个nsq系统的核心,且和我们的连接端,所有的nsqlookupd都直接通讯,nsqd实现了如下功能
topic的创建,清空,暂停,重新激活,销毁,同步
channel的创建,清空,暂停,重新激活,销毁,同步
message的产生,监听,中转,持久化(保存到文件,从文件加载),主动推送消息给各个客户端,消息计数
配置修改,运行状态(协程、内存)统计
架构图中间的nsqlookupd1,nsqlookupd2 是nsqlookupd的单个节点,用于记录nsqd的注册,活跃维持,给连接客户端做nsqd的服务发现。
至少需要开一个,也可以根据实际需要开多个,以实现服务的高可用。使用连接端连接nsqlookup时可以直接给一个nsqlookupd地址的数组,连接端内部会轮询访问,这样即使某个nsqlookupd挂掉了或者网络问题断掉了,其他nsqlookupd进程依然可以提供服务。
架构图下面的是nsq连接库。它需要先跟某个nsqlookupd进行通讯(http),取到所有活跃nsqd的信息,再对所有的nsqd进行通讯(tcp和http)。连接端可以有多种身份
可以作为生产者,进行topic创建、销毁,产生消息推送给nsqd
可以作为消费者,监听指定topic或指定channel,处理nsqd推送过来的消息
还可以既是生产者产生消息,又是消费者处理消息,当然这种情况下,生产和消费的是不同类型消息
注意:nsq连接端的内部实现还是有点复杂的,至少几千行代码,如果实现得不好可能会连累nsqd出问题。但nsq作者并没有把它包含进nsq内部,可能是认为连接库应该交给第三方来实现吧,所以他用go语言实现了连接库go-nsq,放在了nsq的平台,作为go语言的官方推荐连接库,等于是打了个样版
还有其他语言的第三方连接端,nsq作者都放在nsq官方github的首页,大家可以找一下有没有自己需要的,地址 https://github.com/nsqio
常见的语言已有实现,例如:
python语言的是pynsq github地址GitHub - nsqio/pynsq: The official Python client library for NSQ
java语言的是nsq-java github地址https://github.com/nsqio/libnsq
c语言的是libnsq github地址GitHub - nsqio/nsq-java: official Java client library for NSQ
架构图右侧有一个nsqadmin进程,它实现了一个简单的web界面,方便用户查看,操作。
nsqadmin要和所有的nsqlookupd进行连接,收集统计信息。它只是个辅助UI,没必要多开
我们一个测试服的nsqadmin界面如下
在NSQ页面,可以查看所有的topic
可以选择一个topic点击进去,能看到这个topic的统计信息,比如归属的nsqd进程,消息数量(内存中,磁盘中),拥有的channel数量,以及所有channel
也可以选择一个channel点击进去,能看到这个channel的统计信息,比如消息统计(内存中,磁盘中),IN-Flight表飞行中(处理中)的消息数;Deferred表延迟消息的数;Requeued表因处理失败再次入队的消息数
你可以对这些topic和channel进行操作,比如清空,暂停/重新激活,删除等等
在Nodes页面,可以查看所有的nsqd进程信息
在Counter页面,可以看到总消息数量
在Lookup页面,可以查看所有的nsqlookupd进程信息
好了,大家先对nsq的各个部件有个大致的认识,后面我们开始对这些部件详细讲解
todo