一、简介
NSQ是一个基于Go语言的开源的分布式实时消息平台,他的代码托管在GitHub上。
NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架构,可以每天处理数以亿计的实时消息。NSQ的优点是无单点故障、故障容错、高可用性和信息传递的高可靠性。NSQ安装部署简单,容易水平扩展,目前已有很多公司都是采用其作为自身企业内部的实时消息服务。而且它的灵活性很强,支持很多种协议。官方直接提供了拆箱可用的Go库和Python库。
二、示意图
三、基本概念(nsq四大组件)
nsqd:【nsq节点】负责接收、排队、转发消息到客户端的守护进程,并且定时向nsqlookupd服务发送心跳。
nsqlookupd:【nsq调度器】管理nsqd节点拓扑信息并提供最终一致性的发现服务的守护进程。
nsqadmin:nsqd的web统计界面,可实时查看集群的统计数据和执行一些管理任务。
utilities:常见基础功能、数据流处理工具,如nsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsq。
四、进阶概念
topic :一个topic就是程序发布消息的一个逻辑键,当程序第一次发布消息时就会创建topic。
channel :channel组与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,消费者通过这个特殊的channel读取消息,实际上,在消费者第一次订阅时就会创建channel。
channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。
message :消息构成了我们数据流的中坚力量,消费者可以选择结束消息,表明它们正在被正常处理,或者重新将他们排队待到后面再进行处理。每个消息包含传递尝试的次数,当消息传递超过一定的阀值次数时,我们应该放弃这些消息,或者作为额外消息进行处理。
NSQ在操作期间同样运行着两个程序:
nsqd :nsqd守护进程是NSQ的核心部分,它是一个单独的监听某个端口进来的消息的二进制程序。每个nsqd节点都独立运行,不共享任何状态。当一个节点启动时,它向一组nsqlookupd节点进行注册操作,并将保存在此节点上的topic和channel进行广播。
客户端可以发布消息到nsqd守护进程上,或者从nsqd守护进程上读取消息。通常,消息发布者会向一个单一的local nsqd发布消息,消费者从连接了的一组nsqd节点的topic上远程读取消息。如果你不关心动态添加节点功能,你可以直接运行standalone模式。
nsqlookupd :nsqlookupd服务器像consul或etcd那样工作,只是它被设计得没有协调和强一致性能力。每个nsqlookupd都作为nsqd节点注册信息的短暂数据存储区。消费者连接这些节点去检测需要从哪个nsqd节点上读取消息。
五、Mtime配置中心消息相关理解
订阅节点:nsqlookupd 节点 , 也叫 nsqd 发现节点;
发送节点:nsqd 节点,也叫 生产者 节点,
过程:
1、消费者订阅消息(topic + channel);
2、生产者发布消息到nsqd;
3、nsqd接收消息,排队,转发;
4、消费者通过nsqlookupd查找nsqd节点,并消费消息。
核心:nsqlookupd ,nsqd, producer ,consumer;
其他:
我们平时所写的handler项目,其实是一些消息订阅者,同时也是消息消费者。
MsgApplication程序就是在启动时订阅了相关的 nsq 主题(topic) 和 通道(channel)。
参考资料: