nsq整体架构及各个部件作用详解

文章目录

前言

nsq的整体架构图

部件:nsqd

部件:nsqlookupd

部件:nsq连接库

部件:nsqadmin


前言

上两篇博客

centos环境搭建nsq单点_YZF_Kevin的博客-CSDN博客

linux环境搭建nsq集群_YZF_Kevin的博客-CSDN博客

我们讲了nsq是什么,有什么用,它的内部组成部件,下载,单点搭建,集群搭建等等

这一篇博客,我们开始讲nsq的整体架构、运行时的总体流程图,各个部件的作用

nsq的整体架构图

详细解释下

部件:nsqd

最上方的nsqd1,nsqd2,nsqd3,nsqd4都是nsqd的单个节点,至少需要开一个,也可以根据实际需要开多个

nsqd是整个nsq系统的核心,且和我们的连接端,所有的nsqlookupd都直接通讯,nsqd实现了如下功能

topic的创建,清空,暂停,重新激活,销毁,同步

channel的创建,清空,暂停,重新激活,销毁,同步

message的产生,监听,中转,持久化(保存到文件,从文件加载),主动推送消息给各个客户端,消息计数

配置修改,运行状态(协程、内存)统计

部件:nsqlookupd

架构图中间的nsqlookupd1,nsqlookupd2 是nsqlookupd的单个节点,用于记录nsqd的注册,活跃维持,给连接客户端做nsqd的服务发现。

至少需要开一个,也可以根据实际需要开多个,以实现服务的高可用。使用连接端连接nsqlookup时可以直接给一个nsqlookupd地址的数组,连接端内部会轮询访问,这样即使某个nsqlookupd挂掉了或者网络问题断掉了,其他nsqlookupd进程依然可以提供服务。

部件:nsq连接库

架构图下面的是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

架构图右侧有一个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