NSQ 是一个基于Go语言的分布式实时消息平台,它基于 MIT开源协议 发布,代码托管在GitHub,其当前最新版本是 0.3.1版 。NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。另外,官方还提供了拆箱即用Go和Python库。如果读者兴趣构建自己的客户端的话,还可以参考官方提供的 协议规范 。
NSQ是由四个重要组件构成:
NSQ的主要特点如下:
为了达到高效的分布式消息服务,NSQ实现了合理、智能的权衡,从而使得其能够完全适用于生产环境中,具体内容如下:
官方和第三方还为NSQ开发了众多客户端功能库,如官方提供的基于HTTP的 nsqd 、Go客户端 go-nsq 、Python客户端 pynsq 、基于Node.js的JavaScript客户端 nsqjs 、异步C客户端 libnsq 、Java客户端 nsq-java 以及基于各种语言的众多第三方客户端功能库。更多客户端功能库,请读者点击 这里 查看。
从NSQ的 设计文档 中得知,单个nsqd被设计为一次能够处理多个流数据,NSQ中的数据流模型是由stream和consumer组成。Topic是一种独特的stream,Channel是一个订阅了给定Topic的consumer逻辑分组。NSQ的数据流模型结构如下图所示:
从上图可以看出,单个nsqd可以有多个Topic,每个Topic又可以有多个Channel。Channel能够接收Topic所有消息的副本,从而实现了消息多播分发;而Channel上的每个消息被分发给它的订阅者,从而实现负载均衡,所有这些就组成了一个可以表示各种简单和复杂拓扑结构的强大框架。
NSQ最初为提供短链接服务的应用 Bitly 而开发。另外,还有众多著名的应用在使用NSQ,如社交新闻网站 Digg 、私密的社交应用 Path 、著名的开源的应用容器引擎 Docker 、支付公司 Stripe 、新闻聚合网站 Buzzfeed 、查看家人所在位置的移动应用 Life360 、网络工具公司 SimpleReach 等。
有兴趣的读者还可以为NSQ贡献代码、 反馈问题 或者通过官方提供的 快速入门教程 体验下NSQ为高吞吐量的网络服务带来的性能提升。有关NSQ的安装部署、客户端开发等相关信息,请登录 其官网 查看。
感谢郭蕾对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。