DengBiao 1705a83fd1 | 9 kuukautta sitten | |
---|---|---|
images/md | 2 vuotta sitten | |
md | 1 vuosi sitten | |
rabbit | 9 kuukautta sitten | |
rabbitmq | 2 vuotta sitten | |
test | 1 vuosi sitten | |
.gitignore | 2 vuotta sitten | |
LICENSE | 2 vuotta sitten | |
README.md | 2 vuotta sitten | |
go.mod | 2 vuotta sitten | |
main.go | 2 vuotta sitten |
RabbitMQ 3.8.8
Erlang 22.0.7
RabbitMQ 必须基于Erlang 环境才能运行,不同版本的RabbitMq对Erlang 版本要求不同。
直连模式:
每次使用Mq,单独连接,单独开辟信道进行操作 [简单、易控、可用于测试及部分对tcp请求不频繁的情况(如单脚本)]。
连接池模式:
- 每次使用Mq,多连接,多信道 [高复用、稳定、节约资源、避免异常情况产生、可用于生产环境中对mq推拉操作频繁的情况]。
- rabbitmq 官网建议,多线程尽量共享连接,独享信道(大部分连接包目前只实现了单连接的多信道连接池,这种方式在高并发时,单链接就不够用了)。 考虑到高并发时的情况,同时结合实际mq情况,把tcp控制在合理范围内,可以适当放宽请求连接数。
- 实现了多连接多信道的连接池、实现了连接过期时间设置(连接的最后一个信道释放/关闭时,对应的连接如果过期,才进行关闭)、日志打印,可以利用具体框架实现的日志模块打印,默认是标准输出。
简单(simple)
、 工作(work)
、 订阅/发布(fanout)
、 路由routing(direct)
、 部分匹配(topic)
等常用mq工作模式类型推模式
、拉模式
[推模式下将信道置为接收模式,直到取消队列的订阅为止。在接收模式期间,RabbitMQ会不断地推送消息给消费者(当然推送消息的个数还是会受到Qos的限制)。如果只想从队列获得单条消息而不是持续订阅,建议还是使用拉模式。但是不能将Get方法放在一个循环里来代替推模式,这样做会严重影响RabbitMQ的性能。如果要实现高吞吐,消费者理应使用推模式)]。md
结构体rabbit
封装了mq连接池及日常操作的处理方法rabbitmq
封装了mq直接连接及日常操作的处理方法test
提供了mq基本使用几种模式的使用测试用例及关于模式的介绍md文档utils
工具类RabbitMQ消息有两种类型:
惰性队列:RabbitMQ从3.6.0版本开始引入了惰性队列(Lazy Queue)的概念。惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致使长时间内不能消费消息造成堆积时,惰性队列就很有必要了。
Broker
:broker 是指一个或多个 erlang node 的逻辑分组,且 node 上运行着 RabbitMQ 应用程序(可以理解为mq服务器的意思,或者再简单点就是mq节点的意思)。Channel
:信道Message
:消息,由消息头和消息体组成Binding
:绑定,用于建立Exchange和Queue之间的关联Queue
:消息队列Exchange
: 交换器/路由器ACK
:ACK机制是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,MQ收到反馈后才将此消息从队列中删除。消息的ACK确认机制默认是打开的。QOS
:RabbitMQ提供了一种qos(服务质量保证)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于consume或者channel设置Qos的值)未被确认前,不进行消费新的消息。
这种机制一方面可以实现限速(将消息暂存到RabbitMQ内存中)的作用,一方面可以保证消息确认质量(比如确认了但是处理有异常的情况)。Durable(持久化)
: RabbitMq对交换器,队列,消息都可以声明持久化属性,交换器和队列持久化属性为durable(其属性值为false代表不持久化,属性值为true代表持久化),消息持久化属性为deliveryMode(其属性值为1代表不持久化,属性值为2代表持久化)。
- RabbitMq实例以broker表示,当broker重启时,所有未申明durable的交换器和队列都会被删除。
- RabbitMq中消息都被保存在队列中,所以如果队列都删除了,消息不管有没有设置deliveryMode=2都不管用了。
- 综上所述,可以得出的结论为,交换器未声明durable属性不会影响队列的持久化(但是发送方的producer会被影响,无法正常发送消息);只声明队列持久化,重启之后消息会丢失;只声明消息的持久化,重启之后消息随队列一起丢失。单单设置消息持久化而不设置队列的持久化没有任何意义。
autoDelete
:RabbitMq在声明交换器和队列时,都有一个共同的属性为autoDelete(自动删除),autoDelete属性针对的是曾经有过但后来没有的事物(除非常不重要且临时性数据,否则建议设置为false
,不使用)。exclusive(排他性)
:RabbitMq中真正处理消息是队列,自然exclusive也只对队列生效。声明了exclusive属性的队列只对首次声明它的连接可见,并且在连接断开时自动删除。强烈建议,非极端特殊情况,不要使用该属性
noWait
: 是否非阻塞,true表示是。阻塞:表示创建交换器的请求发送后,阻塞等待MQ Server返回信息。非阻塞:不会阻塞等待MQnoLocal
: 是否本地化,设置为true表示不能将同一个connection中生产者发送的消息传递给这个connection中的消费者。