1、NSQ是个什么东西

NSQ,一个基于GO语言的实时、分布式消息队列系统。

GO语言、实时、分布式、消息队列,是对NSQ最简单且也较为全面的诠释。为了能够更好的学习本教程,苦李建议各位看客最好能对消息队列有个初步的认识(自行百度即可)。另外,如果你再有一点GO语言的知识,那么将会对你理解NSQ的特性大有帮助,当然这不是必须的,并不影响看客们对NSQ的使用。

NSQ最初起源于Bitly的短链接服务,它曾支持Bitly每日亿万级的消息推送服务。

当然,作为一款成功的开源软件,必须得到足够的实践证明。当前在使用NSQ的著名应用有(基本还都是墙外的公司):社交新闻网站Digg、私密的社交应用Path、著名的开源的应用容器引擎Docker、支付公司Stripe、新闻聚合网站Buzzfeed、查看家人所在位置的移动应用Life360、网络工具公司SimpleReach等。

2、NSQ有哪些特性

作为我们是否选择使用NSQ的依据,下面列举一下NSQ的主要特性,这些内容均来源于NSQ官方文档,对于洋文过关的看客,建议直接阅读原文。NSQ特点如下:

  • 有分布式且无单点故障的拓扑结构 支持水平扩展,在无中断情况下能够无缝地添加集群节点
  • 低延迟的消息推送,参见官方提供的性能说明文档
  • 具有组合式的负载均衡和多播形式的消息路由
  • 既擅长处理面向流(高吞吐量)的工作负载,也擅长处理面向Job的(低吞吐量)工作负载
  • 消息数据既可以存储于内存中,也可以存储在磁盘中
  • 实现了生产者、消费者自动发现和消费者自动连接生产者,参见nsqlookupd
  • 支持安全传输层协议(TLS),从而确保了消息传递的安全性
  • 具有与数据格式无关的消息结构,支持JSON、Protocol Buffers、MsgPacek等消息格式
  • 非常易于部署(几乎没有依赖)和配置(所有参数都可以通过命令行进行配置)
  • 使用了简单的TCP协议且具有多种语言的客户端功能库
  • 具有用于信息统计、管理员操作和实现生产者等的HTTP接口
  • 为实时检测集成了统计数据收集器StatsD
  • 具有强大的集群管理界面,参见nsqadmin

作为一款高效的分布式消息队列系统,NSQ在实现上进行了聪明的、合理的取舍,使得其能完美的应用于各种生产环境,具体表现如下:

  • 支持消息内存队列的大小设置,默认完全持久化(值为0),消息即可持久到磁盘也可以保存在内存中
  • 保证消息至少传递一次,以确保消息可以最终成功发送
  • 收到的消息是无序的, 实现了松散订购
  • 发现服务nsqlookupd具有最终一致性,消息最终能够找到所有Topic生产者

3、相比其他MQ的优势

基于NSQ无中心设计、节点自动注册和发现的设计理念,NSQ相比其他MQ天然具有以下优势:

  • 部署简单
  • 高可用,无单点故障
  • 确保消息送达
  • 消费者连接所有生产者
  • 向消费者push
  • 提供HTTP接口
当然,以上所有特性并非NSQ专属,但是集所有特性于一身的开源MQ,当前并不多见。

4、其他

  • 源码:https://github.com/nsqio/nsq
  • 问题:https://github.com/nsqio/nsq/issues
  • 官方:nsq-users@googlegroups.com

扫码关注李苦李公众号

李苦李公众号

标签: 教程, 消息队列, NSQ