QCon北京|3天沉浸式学习,跳出信息茧房。 了解详情
写点什么

NSQ:分布式的实时消息平台

  • 2015-02-06
  • 本文字数:1673 字

    阅读完需:约 5 分钟

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 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015-02-06 10:4648685
用户头像

发布了 46 篇内容, 共 53.1 次阅读, 收获喜欢 15 次。

关注

评论

发布
暂无评论
发现更多内容

Flink+Clickhouse构建实时数仓的最佳实践

Wping

大数据 flink 实时数仓 Clickhouse

iOS 面试策略之语言工具-Xcode使用

iOSer

ios xcode 语言 & 开发

Nginx性能分析之gpreftools

运维研习社

nginx 性能分析 5月日更

SpringBoot技术专题—来看看异步处理返回方案

洛神灬殇

Java WebAsyncTask 5月日更 AsyncContext DeferredResult

聊聊人像抠图背后的算法技术

华为云开发者联盟

hilens 抠图 工程 抠图算法 baseline

双非渣硕,是如何拿到苏宁、阿里的offer的?(分享学习心得)

Java 程序员 架构 面试

python str模块

若尘

Python编程 str 5月日更

真实的DevOps落地,应该是这样的 ↓

BoCloud博云

DevOps 敏捷开发

GitHub开源:狗屁不通文章生成器

不脱发的程序猿

GitHub 开源 狗屁不通文章生成器

Java开发5年,我为什么选择从蚂蚁金服离职?浅谈经历和经验!

Java架构追梦

Java 架构 面试 蚂蚁金服 经历分享

华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案

华为云开发者联盟

数据库 opengauss 华为云 GaussDB 云数据库

微服务转型系列4:理念指导实践,厘清微服务建设的主要内容和顺序

BoCloud博云

微服务

51CTO熊平:HarmonyOS是大势所趋

科技汇

KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力

阿里巴巴云原生

容器 开发者 云原生 监控 中间件

SecSolar:为代码“捉虫”,让你能更专心写代码

华为云开发者联盟

代码 华为云 CloudIDE 代码安全检测 SecSolar

这个好用的分布式应用配置中心,我们把它开源了

百度Geek说

分布式 大前端 服务器

抱歉,“行业毒瘤”这个锅,低/无代码不背

陈思

低代码 无代码 低代码平台 无代码平台

华为云官网负责人明哥:我们是如何做到门面不倒,8个月挑战业界翘楚?

华为云开发者联盟

JavaScript node.js Serverless 云原生 大前端

百信银行基于 Apache Hudi 实时数据湖演进方案

Apache Flink

大数据 flink

单片机I/O控制方式(UART中断和DMA中断的区别)

不脱发的程序猿

嵌入式 单片机 GPIO的原理、特性 单片机I/O设备的控制方式

Golang command source code

escray

学习 极客时间 Go 语言 5月日更

雀食蟀!Java Netty实战入门

北游学Java

Java Netty 网络 框架

音视频实战(6)- RTSP媒体协议流的录制方案及其覆盖策略详解

liuzhen007

音视频 5月日更 签约计划第二季

【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

牧小农

JVM

🕋【Redis干货领域】彻底走进主从架构的世界(入门篇)

洛神灬殇

主从同步 Redis 核心技术与实战 5月日更 Redis系列专题 原理篇

灵魂拷问:后端业务开发要会用 K8s 到什么程度?

阿里巴巴云原生

容器 运维 云原生 k8s 存储

音视频在智能手表上的应用

anyRTC开发者

音视频 WebRTC IoT RTC

PyQt5 实现可空值的 QDateTimeEdit

一代咩神

Python PyQt QDateTimeEdit

参照STM32时钟树配置STM32CubeMX Clock Configuration(STM32L011G4U6为例)

不脱发的程序猿

单片机 STM32微控制器 时钟树 STM32CubeMX STM32时钟配置

Fluid 进入 CNCF Sandbox,加速大数据和 AI 应用拥抱云原生

阿里巴巴云原生

人工智能 容器 云原生 调度 弹性计算

test1

靠谱哥

NSQ:分布式的实时消息平台_语言 & 开发_李小兵_InfoQ精选文章