微信号:infoqchina

介绍:有内容的技术社区媒体

NSQ:基于Go语言的分布式实时消息平台

2015-02-10 11:45 InfoQ


极客邦开通个人微信号啦!如果你希望更多的在朋友圈见到极客邦,看到InfoQ的精彩内容,寻找我们主办与支持的给力活动;如果你希望能更经常地与我们联系,隔三差五调戏我们一下,那就复制微信号:HelloStuQ ,加Q妹的个人微信吧~


NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版。NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。另外,官方还提供了拆箱即用Go和Python库。如果读者兴趣构建自己的客户端的话,还可以参考官方提供的协议规范


NSQ是由四个重要组件构成:

nsqd一个负责接收、排队、转发消息到客户端的守护进程


nsqlookupd管理拓扑信息并提供最终一致性的发现服务的守护进程


nsqadmin一套Web用户界面,可实时查看集群的统计数据和执行各种各样的管理任务


utilities常见基础功能、数据流处理工具,如nsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsq


NSQ的主要特点如下:

具有分布式且无单点故障的拓扑结构支持水平扩展,在无中断情况下能够无缝地添加集群节点


低延迟的消息推送,参见官方提供的性能说明文档


具有组合式的负载均衡和多播形式的消息路由


既擅长处理面向流(高吞吐量)的工作负载,也擅长处理面向Job的(低吞吐量)工作负载


消息数据既可以存储于内存中,也可以存储在磁盘中


实现了生产者、消费者自动发现和消费者自动连接生产者,参见nsqlookupd


支持安全传输层协议(TLS),从而确保了消息传递的安全性


具有与数据格式无关的消息结构,支持JSON、Protocol Buffers、MsgPacek等消息格式


非常易于部署(几乎没有依赖)和配置(所有参数都可以通过命令行进行配置)


使用了简单的TCP协议且具有多种语言的客户端功能库


具有用于信息统计、管理员操作和实现生产者等的HTTP接口


为实时检测集成了统计数据收集器StatsD


具有强大的集群管理界面,参见nsqadmin


为了达到高效的分布式消息服务,NSQ实现了合理、智能的权衡,从而使得其能够完全适用于生产环境中,具体内容如下:

支持消息内存队列的大小设置,默认完全持久化(值为0),消息即可持久到磁盘也可以保存在内存中


保证消息至少传递一次,以确保消息可以最终成功发送


收到的消息是无序的, 实现了松散订购


发现服务nsqlookupd具有最终一致性,消息最终能够找到所有Topic生产者


官方和第三方还为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 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 即将来临的Android N 北京Android N开发者会议见闻 Stackoverflow评选的10本最有影响力IT图书 【第570期】无限滚动与分页设计的优缺点及应用场景分析 论程序媛的自我修养