NSQ 是什么?使用 go 语言开发的一款开源的消息队列,具有轻量级、高性能的特点,而关于消息队列,我在之前的文章中介绍过另一款 RabbitMQ,感兴趣的也可以看看:
01
—
概述
NSQ 组件:
1、nsqd:接受、排队、传递消息的守护进程,消息队列中的核心。
2、nsqlookupd:管理拓扑信息,其实就是围绕 nsqd 的发现服务,因为其存储了 nsqd 节点的注册信息,所以通过它就可以查询到指定 topic 主题的 nsqd 节点。
3、nsqadmin:一套封装好的 WEB UI ,可以看到各种统计数据并进行管理操作。
4、utilities:封装好的一些简单的工具(实际开发中用的不多)。
如下图所示:
1、生产者 producer 将消息投递到指定的 nsqd 中指定的 topic 主题。
2、nsqd 可以有多个 topic 主题,一旦其接受到消息,将会把消息广播到所有与这个 topic 相连的 channel 队列中。
3、channel 队列接收到消息则会以负载均衡的方式随机的将消息传递到与其连接的所有 consumer 消费者中的某一个。
注意:生产者关注的是 topic,消费者关注的是 channel。消息是存在 channel 队列中的,其会一直保存消息直到有消费者将消息消费掉,同时 channel 队列一旦创建其本身也不会自动消失,另外消息默认是存在内存中的,一旦超过内存大小(可通过 --mem-queue-size 配置)则会被存储到磁盘上。
再看下图:
通过 nsqadmin 可以看到整个集群的统计信息并进行管理,多个 nsqd 节点组成集群并将其基本信息注册到 nsqlookupd 中,通过 nsqlookupd 可以寻址到具体的 nsqd 节点,而不论是消息的生产者还是消费者,其本质上都是与 nsqd 进行通信(如第一张图所示)。
02
—
其它
1、默认情况下消息不会被持久化到磁盘,只有当超出内存限制时才会将部分消息写入磁盘,但只要设置 --mem-queue-size=0 就可以将所有消息都持久化到磁盘。
2、NSQ 保证消息至少被传递一次,但也有可能极端情况下会被传递多次,消费者需要额外注意这一点。
3、消息是无序的。
4、官方建议将 nsqd 与消息的生产者部署到一起,这种模式将消息流构建为消费问题而不是生产问题,这种模式更加简单但非强制。
5、nsqlookupd 并非一定要使用,但在集群模式下建议使用,官方建议每个数据中心部署至少三个 nsqlookupd 就可以应对成百上千的集群节点(每个nsqlookupd 中间是相互独立的,保证其高可用)。
6、topic 和 channel 没有内置的限制,但其会受限于宿主机的CPU和内存性能。
7、nsq 没有复杂的路由,没有 replication 副本备份。
总而言之,NSQ 高效轻量、简单、易于分布式扩展。另外有赞团队自己改造了一版 NSQ 并开源了出来( https://github.com/youzan/nsq ),视频:
https://www.youtube.com/watch?v=GCOvuCKe5zA ,感兴趣的也可以了解下。