一个自己封装的NSQ项目
对
nsqio/go-nsq
项目的封装
https://github.com/Kevin005/nsq-std-foundation
消息队列解决的问题
- 模块间解耦:将一个流程加入一层数据接口拆分成两个部分,上游专注通知,下游专注处理,服务接口依赖变为数据依赖
- 消息的异步:上游发送消息以后可以马上返回,处理工作交给下游进行,最终一致性
- 消息的缓冲:应对流量的突然上涨变更,消息队列有很好的缓冲削峰作用
- 广播:让一个消息被多个下游进行处理
NSQ消息队列优点
高可用
(无单点问题) 生产者和消费者是直接连上各个nsqd节点,因此即使nsqlookupd挂了,也不影响线上正常使用。即使某个nsqd节点挂了,生产者发布消息时,发现节点挂了,可以选择其他节点(客户端负责实现),单个节点挂了对消费者无影响(go-nsq服务会重新分配nsqd)
高性能
生产者在发布消息时,可以随机发布到集群中nsqd节点(客户端负责实现),可以在一定程度上达到负载均衡。消费者同时监听着集群中所有nsqd节点
高可扩展
当向集群中添加节点时,首先消费者会通过nsqlookupd发现新的节点加入,并自动连接。生产者也可以通过nsqlookupd找到活跃的nsqd节点
nsqio/go-nsq项目
1.项目结构
+-- apps //msqadmin、nsqd、nsqlookupd等服务入口
|
+-- msqadmin //可视化界面服务
|
+-- nsqd //负责接收,排队,投递消息给客户端的服务
|
+-- nsqlookupd //负责管理拓扑信息并提供发现的服务
nsqd/topics
一个可供订阅的话题,消息分类的概念,会下发消息给每个独立的channelnsqd/channel
一个通道(channel)是消费者订阅了某个话题的逻辑分组。 一个Topic有可以分为多个Channel,每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,从而实现多路分发,而channel上的每个消息被分发给它的订阅者,从而实现负载均衡。在消费者第一次订阅时就会创建channel,channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。
2.消息体类型和协议
消息body字段为[]byte,可以支持JSON, Protocol Buffers等
lookupd、nsqd都有支持http、tcp协议接口
API文档地址 https://nsq.io/components/nsqd.html