• go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin


    nsqlookupd

    官方文档解释见:http://bitly.github.io/nsq/components/nsqlookupd.html

    用官方话来讲是:nsqlookupd管理拓扑信息,客户端根据特定的topic查询nsqlookupd来发现nsqd生产者及nsqd广播topic和channel信息。比较难懂,所以接下来,用通俗的话来解释。

    首先讲点别的东西,用过linux的同学可能会发现,linux下很多应用,比如apache、mysql、ftp等它们的服务名称都是在d结尾的。如:

    apache ->  httpd

    mysql -> mysqld

    vsftp -> vsftpd

    最后的结尾d是Daemon的意思,守护进程,这种进程不会因为终端窗口关闭就停止执行。比如apache,执行 service httpd start后,apache就启动了, 终端关掉后,apache仍然在后台运行。

    好了,现在你会发现,我们的nsqlookupd和nsqd也是在d结尾的,这就暗示他们可能是守护进程,而事实上也确实是这样。

    nsqlookupd就是类似apache一样的一个后台服务,它可以理解为整个nsq系统的神经中枢,启动以后,它默认会同时监听两个端口,在4160端口,建立一个tcp server,用于和nsqd进行数据沟通。在4161上呢,会建立一个http server,用于和nsqadmin进行数据交互。

    nsqd

    官方文档地址:http://bitly.github.io/nsq/components/nsqd.html

    用官方话解释为:nsqd接收队列、发送消息到客户端。

    上一讲中,执行的第二个命令:nsqd –lookupd-tcp-address=127.0.0.1:4160

    表示启动一个nsqd 服务,同时告诉这个服务,nsqlookupd的地址在127.0.0.1:4160。4160端口,也就是nsqlookupd监听的tcp erver的地址。有了这个地址后,nsqd就可以和nsqlookupd地建立连接,然后做数据交互。同时,nsqd自己会默认监听4151端口,接收以http方式发送来的消息数据。

     

    nsqadmin

    官方文档见:http://bitly.github.io/nsq/components/nsqadmin.html

    提供一个浏览器可访问的web页面,用于实时查看集群状态和执行一些管理操作。

    上一讲中,第三个命令:nsqadmin –lookupd-http-address=127.0.0.1:4161

    表示启动nsqadmin,同时告诉这个服务,nsqlookupd监听的http地址在127.0.0.1:4161,这样,nsqadmin也会和nsqlookupd建立连接,进行数据交互。而nsqadmin 本身会监听4171端口,提供一个web服务,供浏览器访问,查看数据。所以在上一讲,最后我们通过访问http://127.0.0.1:4171/查看统计数据。

    curl

    这个应该都很熟悉的命令,它可以发起网络请求到指定的URL。可以参考网址:

    http://blog.51yip.com/linux/1049.html

    上一讲中:

    curl -d “hello world 1” “http://127.0.0.1:4151/put?topic=test”

    表示向网址http://127.0.0.1:4151/put?topic=test发起POST请求,参数为hello world 1,这4151端口,刚好是nsqd监听的端口,也就是说nsqd可以接口网络发来的信息,并放入队列保存起来,供消息的“消费者”来取出数据并处理。所以前面介绍nsqd的时候提到“nsqd接收、队列、发送消息到客户端。”。

    nsq_to_file

    这是nsq提供一个简单的消息“消费者”,他把某个指定“topic”下的数据存在指定的文件中。

    上一讲的命令:

    nsq_to_file –topic=test –output-dir=F: mp –lookupd-http-address=127.0.0.1:4161

    表示把指定的话题test下的数据,放在目录F: mp下面。所以可以看到文件中保存了三个hello world,因为我们向topic=test的URL curl了三次hello world.

    同时大家可能会注意到,nsq_to_file指定的最后一个参数,lookupd-http-address的4161端口是nsqlookupd的地址,不是nsqd的,而我们curl发消息是发到nsqd的4151端口了,这是什么原因呢?

    源码我也没读完,呵呵,所以呢,目前猜测是因为nsqlookupd维护着所有nsqd的状态。知道nsqlookupd的地址后,就可以问nsqlookupd要所有的nsqd的信息了。

    补充一个图:

    nsq

    举例

    到此为止,几个命令都说完了。为方便理解,接下来讲个形象的例子。

    nsqd 可以看作是一个人。

    nsqlookupd 是公安局的户籍办。

    nsqadmin 是人口普查办公室。

    每产生一个nsqd,都要连到nsqlookupd汇报状态,及定时发送心跳包。对应的:每个人出生或者过世,都要到户籍办去上户或销户,而平时有生之年,你可能还要偶尔去去户籍办,出个户籍证明之类的。

    管理者可以通过nsqadmin来查看统计数据,同时做一些管理操作。对应的,人品普查的时候,可以通过公安局来查看,各地区的人口数、性别比例、年龄分布等等。

    例子不太恰当,不过对理解也有些帮助,就放在这里了。

  • 相关阅读:
    HTML新解
    关于EF4.1更新数据后的显示问题PagedList
    SQL2008中的XML字段操作,与命名空间相关
    64位Win7+iis7下发布MVC3 web项目
    蓝屏、异常关机操成的 未能加载文件或程序集“....”或它的某一个依赖项。参数错误。
    FreeWriting_12
    FreeWriting_13
    【转】ACE的构建(VC++6.0环境)
    Freewriting_10
    FreeWriting_16
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7456926.html
Copyright © 2020-2023  润新知