NSQ 设计

翻译自https://nsq.io/overview/design.html

NSQ是一个消息队列,其设计的目的如下(顺序无关):

  • 支持高可用和单点故障(SPOF)的拓扑
  • 满足健壮的消息传递保障需求
  • 限制内存
  • 对消息生产者和消费者都足够简单的配置
  • 简单的升级路径
  • 高效

简化配置和管理

只需要一个nsqd实例就可以同时处理多个数据流。数据流在NSQ中叫做topic,每一个topic有一个或多个channel。每一个channel接收来自一个topic的所有消息的拷贝。在实践中,一个channel对应于一个topic的下游消费者。

topic和channel不是同时被配置的:

  • 当上游生产者第一次发布消息到命名topic,或下游channel第一次订阅命名topic时,会创建一个对应的topic。
  • 当消费者订阅命名channel时,会创建一个对应的channel。

每个topic和channel之间都拥有相互独立的缓存队列,放置一个慢消费者造成整个系统的积压。

每个channel通常有多个消费者。假设所有的消费者都可以接收消息,每一条消息会被随机发送到一个消费者,如下:


topic,channel和consumer

在topic->channel之间,消息是广播的,但在channel和consumer之间,消息是分布式发送的。即每一个channel都从topic接收全量的消息,但每一个customer只从channel接收部分消息。

NSQ包含一个助手应用nsqlookupd,为消费者查找感兴趣的topic的的nsqd实例地址提供目录服务。这个服务让生产者和消费者解耦,相互独立,通过nsqlookupd来关联,降低了系统的复杂度。

在底层实现中,每一个nsqd实例和nsqlookupd之间维持了一条TCP长连接,周期性的发送它目前的状态。nsqlookupd使用该信息决策消费者应该使用哪个nsqd实例。

给一个topic添加一个新的消费者,只要启动一个配置了nsqlookupd地址的NSQ客户端即可。无需再针对生产者和消费者做任何配置,一切都由nsqlookupd来完成。

需要注意的是nsqd和nsqlookupd都是独立部署的,即多个nsqd之间没有关联,多个nsqlookupd之间也没有关联。

nsqadmin是用来监控和管理集群的工具,提供了web界面来浏览topcs/channels/consumers的拓扑和关键信息,并且可以执行删除或清空channel等任务。

nsqadmin

排除单点故障

NSQ被设计用于分布式环境。nsqd客户端通过TCP和所有提供相同topic的生产者连接。所以其中没有中间人,没有消息代理,也不存在单点故障。



对nsqlookupd来说,通过运行多个实例来达到高可用的目的。多个nsqlookupd之间不会通信,数据被认为是最终一致的。消费者查询它配置的所有nsqlookupd实例,并将返回值合并,得到最终结果。

消息传递保障

NSQ保证每条消息至少被传递成功一次,可能会重复传递多次。消费者应该对收到的消息做去重处理,或者保证收到消息后的处理是无副作用的。
消息保证的工作机制如下(设计客户端已经成功连接并订阅了一个topic):

  1. 客户端指示已经准备好接收消息
  2. NSQ发送消息,并临时存储在本地(在重传时使用)
  3. 客户端回复FIN或者REQ消息来指示消息接收成功或者失败。如果客户端没有回复消息,NSQ会在一定时间超时后,自动重传该消息。
    上述机制保证了导致消息丢失的唯一场景是nsqd实例的意外宕机,所有在内存中还未发送的消息,以及需要重传的消息都会丢失。
    如果防止消息丢失是重中之重的事情,针对上述场景也可以做一些事情。一种方式是配置冗余的nsqd组,来传递重复的消息。

限制内存使用

nsqd提供了一个配置选项--mem-queue-size,决定一个队列保存在内存中的消息数量。如果队列中消息数量超过阈值,消息会被写入到磁盘。这样,就先知了一个nsqd进程的内存使用量为mem-queue-size*#_of_channels_and_topics
通过将该选项设置的比较小(0或者1),也能得到更为可靠的消息传递服务。持久化到磁盘的消息在nsqd进程重启后依然有效。

高效

NSQ基于类memcached的通信机制实现,客户端只需要回复其容量信息。所有消息数据(包括尝试次数、时间戳等元数据)都保存在核心上。这样消除了重传时服务器和客户端之间消息的来回拷贝。同时也简化了客户端实现,不需要再维持消息状态。
在数据协议方面,为了最大化性能和吞吐量的一个关键设计是直接向客户端推送数据,而不是等待客户端来查询。这个概念被称为RDY状态,本质上是客户端侧的流控。
当一个客户端连接到nsqd,并订阅到一个channel时,它的RDY状态被置为0,表示目前还不能接收消息。当客户端准备好接收消息时,它会发送一条命令到nsqd,更新其RDY值到它可以接收的消息数量。nsqd就可以将100条消息推送给客户端,中间不需要其他的任何交互。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 1. 概述 NSQ 是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一...
    楚江云阅读 6,689评论 0 10
  • Nsq简介 1.1. 是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的...
    Yangwenliu阅读 2,690评论 0 4
  • 写在前面: NSQ版本 : v1.2.0在源码层面,完整阅读了一个GO-Lang实际的项目-NSQ,目标是让自己从...
    沉寂之舟阅读 1,749评论 0 1
  • 本文参考:https://zhuanlan.zhihu.com/p/37081073 简介 NSQ是Go语言编写的...
    强某某阅读 2,356评论 0 0
  • 1.安装 根据官方安装指引页面下载最新稳定版的二进制包https://nsq.io/deployment/inst...
    渺小Y阅读 7,016评论 1 4