NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。
NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征
适合小型项目使用,用来学习消息队列实现原理、学习 golang channel知识以及如何用 go 来写分布式,为什么说适合小型小型项目使用因为,nsq 如果没有能力进行二次开发的情况存在的问题还是很多的。
NSQ优势 /* 1. NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性, 并提供可靠的消息交付保证. 2. NSQ支持横向扩展,没有任何集中式代理 3. NSQ易于配置和部署,并且内置了管理界面 */ NSQ特性 /* 1. 支持无 SPOF 的分布式拓扑 2. 水平扩展(没有中间件,无缝地添加更多的节点到集群) 3. 低延迟消息传递 (性能) 4. 结合负载均衡和多播消息路由风格 5. 擅长面向流媒体(高通量)和工作(低吞吐量)工作负载 6. 主要是内存中(除了高水位线消息透明地保存在磁盘上) 7. 运行时发现消费者找到生产者服务(nsqlookupd) 8. 传输层安全性 (TLS) 9. 数据格式不可知 10. 一些依赖项(容易部署)和健全的,有界,默认配置 11. 任何语言都有简单 TCP 协议支持客户端库 12. HTTP 接口统计、管理行为和生产者(不需要客户端库发布) 13. 为实时检测集成了 statsd 14. 健壮的集群管理界面 (nsqadmin) */注意点
/* 1. 消息默认不持久化, 可以配置成持久化模式, nsq采用的方式是内存+硬盘的模式,当内存到一定程度就会持久化到硬盘. 如果将 --mem-queue-size设置为0, 所有的消息将会存储到磁盘. 服务器重启时也会将在内存中的消息持久化 2. 每条消息至少传递一次 3. 消息不保证有序. */ NSQ应用场景参考上图利用消息队列把业务流程中的非关键流程异步化, 从而显著降低业务请求的响应时间
应用解耦通过使用消息队列将不同业务逻辑解耦,降低系统间耦合,提高系统的健壮性, 后续有其他的业务要使用订单数据可直接订阅消息队列, 提高系统的灵活性.
流量削峰类似秒杀(大秒)等场景下,某一时间可能会产生大量的请求,使用消息队列能够为后端处理请求提供一定的缓冲区,保证后端服务的稳定性。
nsqd: 是一个进程监听了http,tcp两种协议, 用来创建topic,channel, 分发消息给消费者,向nsqlooup 注册自己的元数据信息(topic、channel、consumer),自己的服务信息,最核心模块。
nsqd 是一个守护进程,负责接收,排队,投递消息给客户端。也就是说这个服务是干活的。它可以独立运行,不过通常它是由 nsqlookupd 实例所在集群配置的。
/* 特性: 1. 对订阅了同一个topic,同一个channel的消费者使用负载均衡策略(不是轮询) 2. 只要channel存在,即使没有该channel的消费者,也会将生产者的message缓存到队列中(注意消息的过期处理) 3. 保证队列中的message至少会被消费一次,即使nsqd退出,也会将队列中的消息暂存磁盘上(结束进程等意外情况除外) 4. 限定内存占用,能够配置nsqd中每个channel队列在内存中缓存的message数量,一旦超出,message将被缓存到磁盘中 5. topic,channel一旦建立,将会一直存在,要及时在管理台或者用代码清除无效的topic和channel,避免资源的浪费 */nsqlookup: 存储了nsqd的元数据和服务信息(endpoind),向消费者提供服务发现功能, 向nsqadmin提供数据查询功能.
nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者,并且 nsqd 节点广播话题(topic)和通道(channel)信息。也就是说nsqlookupd是管理者。
/* 特性: 1. 唯一性,在一个Nsq服务中只有一个nsqlookupd服务。当然也可以在集群中部署多个nsqlookupd,但它们之间是没有关联的. 2. 去中心化,即使nsqlookupd崩溃,也会不影响正在运行的nsqd服务 3. 充当nsqd和naqadmin信息交互的中间件 4. 提供一个http查询服务,给客户端定时更新nsqd的地址目录. */