🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# [nsq][1] [参考文档 含go实例][3] [消息的生命周期][4] [nsqadmin界面][2] ## 组件 ### nsqlookupd 管理nsqd节点拓扑信息并提供最终一致性的发现服务的守护进程 ### nsqd 负责接收、排队、转发消息到客户端的守护进程,并且定时向nsqlookupd服务发送心跳 * Topic ——一个topic就是程序发布消息的一个逻辑键,当程序第一次发布消息时就会创建topic。 * Channels ——channel组与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,消费者通过这个特殊的channel读取消息,实际上,在消费者第一次订阅时就会创建channel。 Channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。 * Messages——消息构成了我们数据流的中坚力量,消费者可以选择结束消息,表明它们正在被正常处理,或者重新将他们排队待到后面再进行处理。每个消息包含传递尝试的次数,当消息传递超过一定的阀值次数时,我们应该放弃这些消息,或者作为额外消息进行处理。 ### nsqadmin nsq的web统计界面,可实时查看集群的统计数据和执行一些管理任务。 ![](https://res.infoq.com/news/2015/02/nsq-distributed-message-platform/zh/resources/0206001.gif) 从上图可以看出,单个nsqd可以有多个Topic,每个Topic又可以有多个Channel。Channel能够接收Topic所有消息的副本,从而实现了消息多播分发;而Channel上的每个消息被分发给它的订阅者,从而实现负载均衡,所有这些就组成了一个可以表示各种简单和复杂拓扑结构的强大框架。 ## NSQ的主要特点如下 * 具有分布式且无单点故障的拓扑结构 支持水平扩展,在无中断情况下能够无缝地添加集群节点 * 低延迟的消息推送,参见官方提供的性能说明文档 * 具有组合式的负载均衡和多播形式的消息路由 * 既擅长处理面向流(高吞吐量)的工作负载,也擅长处理面向Job的(低吞吐量)工作负载 * 消息数据既可以存储于内存中,也可以存储在磁盘中 * 实现了生产者、消费者自动发现和消费者自动连接生产者,参见nsqlookupd * 支持安全传输层协议(TLS),从而确保了消息传递的安全性 * 具有与数据格式无关的消息结构,支持JSON、Protocol Buffers、MsgPacek等消息格式 * 非常易于部署(几乎没有依赖)和配置(所有参数都可以通过命令行进行配置) * 使用了简单的TCP协议且具有多种语言的客户端功能库 * 具有用于信息统计、管理员操作和实现生产者等的HTTP接口 * 为实时检测集成了统计数据收集器StatsD * 具有强大的集群管理界面,参见nsqadmin ## 为了达到高效的分布式消息服务,NSQ实现了合理、智能的权衡,从而使得其能够完全适用于生产环境中,具体内容如下: * 支持消息内存队列的大小设置,默认完全持久化(值为0),消息即可持久到磁盘也可以保存在内存中 * 保证消息至少传递一次,以确保消息可以最终成功发送 * 收到的消息是无序的, 实现了松散订购 * 发现服务nsqlookupd具有最终一致性,消息最终能够找到所有Topic生产者 [1]:http://nsq.io/overview/quick_start.html [2]:http://blog.csdn.net/charn000/article/details/48109665 [3]:https://segmentfault.com/a/1190000009194607 [4]:https://www.cnblogs.com/zhangboyu/p/7452759.html