Hits

NSQ消息队列简介

NSQ服务端

  • Nsq是实时的分布式消息处理平台,其设计的目的用来大规模地处理每天数以十亿计数级别的消息。
  • 高性能、高可用、可分布式管理的消息队列。可做内部服务之间的通讯。
  • Nsq具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。
  • Nsq非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。另外,官方还提供了拆箱即用Go和Python库。

Nsq服务端介绍

在使用nsq服务之前,有必要了解nsq三个核心组件。

nsqlookupd

nsqlookup是守护进程负责管理拓扑信息。客户端通过查询nsqlookupd来发现指定话题(topic)的生产者,并且nsqd节点广播话题(topic)和通道(channel)信息

简单的说nsqlookupd就是中心管理服务,它使用tcp(默认端口4160)管理nsqd服务,使用(默认端口4161)管理nsqadmin服务,同时为客户端提供查询服务。

总的来说,nsqlookupd具有以下功能或特性 - 唯一性,在一个Nsq服务中只有一个nsqlookupd服务。当然也可以在集群中部署多个nsqlookupd,但它们之间是没有关联的。 - 去中心化,即使nsqlookupd崩溃,也不会影响正在运行的nsqd服务。 - 充当nsqd和nsqadmin信息交互的中间件。 - 提供一个http查询服务,给客户端定时更新nsqd的地址目录。

nsqadmin

是一套WEB UI,用来汇集集群的实时统计,并执行不同的管理任务。

总的来说,nsqadmin具有以下功能或特性:

  • 提供一个对topic和channel统一管理的操作界面,以及各种实时监控数据的展示,界面设计简洁,操作也很简单
  • 展示所有message的数据,装X神器
  • 能够在后台创建topic和channel,这个不常用到
  • nsqadmin的所有功能都必须依赖于nsqlookupd,nsqadmin只是向nsqlookupd传递用户操作并展示来月nsqlookupd的数据

nsqadmin的默认访问地址是http://127.0.0.1:4171/

nsqd

nsqd是一个守护进程,负责接收,排队,投递消息给客户端。

简单的说,真正干活的就是这个服务,它主要负责message的收发,队列的维护。nsqd会默认监听一个tcp端口(4150)和一个http端口(4151)以及一个可选的https端口

nsqd具有以下功能或特性:

  • 对订阅了同一个topic,同一个channel的消费者使用负载均衡策略(不是轮询)
  • 只要channel存在,即使没有该channel的消费者,也会将生产者的message缓存到队列中(注意消息的过期处理)
  • 保证队列中的message至少会被消费一次,即使nsqd退出,也会将队列中的消息暂存到硬盘上(结束进程等意外情况除外)
  • 限定内存占用,能够配置nsqd中每个channel队列在内存中缓存的message数量,一旦超出,message将被缓存到磁盘中
  • topic,channel一旦建立,将会一直存在,要及时在管理台或者用代码清除无效的topic和channel,避免资源的浪费

这是官方的图,第一个channel(metrics)因为有多个消费者,所以出发了负载均衡机制。后面两个channel由于没有消费者,所有的message均会被缓存在响应的队列里,直到消费者出现 nsqd

这里想到的一个问题是,如果一个channel只有生产者不停的投递message,会不会导致服务器资源被耗尽?也许nsqd内部做了相应处理,但还是要避免这种情况的出现。

Nsq服务端与客户端的关系

了解nsqlookupd,nsqd与客户端中消费者和生产者的关系

消费者

消费者有两种方式与nsqd建立连接

  • 消费者直连nsqd,这是最简单的方式,缺点是nsqd服务无法实现动态伸缩
  • 消费者通过http查询nsqlookupd获取该nsqlookupd上所有nsqd的连接地址,然后再分别和这些nsqd的链接地址,然后再分别和这些nsqd建立连接,但是客户端会不停的向nsqlookupd查询最新的nsqd地址目录

生产者

生产者必须直连nsqd去投递message(网上说可以连接到nsqlookupd,让nsqlookupd自动选择一个nsqd去完成投递,但是我用Producer的TCP是连不上nsqlookupd的,不确定http可不可以)

这里有个问题就是如果生产者所连接的nsqd炸了,那么message就会投递失败,所以在客户端必须自己实现响应的备案方案。

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 219 天前,文中所描述的信息可能已发生改变,请谨慎使用。

专题「服务器相关开发」的其它文章 »

Comments