什么是mq:
mq就是消息队列,能帮助我们实现上下游的消息传递,是一种消息跨进程的通信机制
为什么要用mq:
流量消峰
假如订单系统最多只能处理一万次订单,但是在高峰期,超过了一万订单之后就会崩。这时候就要我们做消息队列缓冲,让访问的人员进行排队,来达到消峰的目的。访问的速度会有所下降,但是总比崩盘了好。
应用解耦
以电商系统为例,应用中订单系统需要调用库存系统、支付系统、物流系统,如果在调用过程中,任何一个系统调用失败,那么就会下单异常。
如果我们用消息队列,由消息队列发送消息给库存系统、支付系统、物流系统,如果有系统故障,那么消息队列会一直监督他完成。
异步处理
RabbitMq的概念:
四大核心:
可以用发快递来举例:
RabbitMQ工作原理
生产者代码:
代码可以对应上图,都是根据图中的步骤来的。
首先创建工厂,设置完成地址,用户名和密码。第二步就是创建链接,然后创建信道,通过信道去链接交换机,交换机链接队列,也可以通过默认交换机去链接队列,最后再通过链接中的信道,发消息给消费者。
通过信道发送消息
消息发送完毕之后,我们可以从Rabbit后台界面当中找到队列
消费者代码
创建工厂
创建连接、信道
声明 接收消息
取消消息时的回调
Rabbit工作队列原理:
简单俩说就是生产者发送了大量的消息,有多个消费者接收处理消息,消费者之间是竞争关系,消息轮训接收。
消息应答概念
消息应答分为自动应答和手动应答
自动应答接收到消息后,马上就会应答,不一定完没完成工作,所以并不靠谱,需要一个优良的环境下才能用自动应答。
手动应答的方法:
手动应答的好处就是可以批量应答,减少网络堵塞
建议不要批量应答,因为如果有A、B、C三个消息,如果当前执行完的是C那么就应答C,如果A、B没有执行完成,批量应答也会进行应答,也可能会出现消息丢失的情况,所以尽量不要批量应答。
消息重新入队
向C1、C2中发送消息,如果C1宕机了,出现了故障,那么这个数据不会丢失,会重新返回队列,然后再交给C2进行处理。
Rabbit持久化
Rabbit是可以进行持久化的,可以将消息和队列进行持久化,持久化的目的就是为了保证数据不丢失。
队列持久化:
队列如果不做持久化,如果Rabbit重启,该队列就会被删除掉
消息持久化:
如果队列做了持久化,消息没做持久化,当队列遇到故障重启了,消息就会丢失。
不公平分发:
预取值分发:可以设定每个消费者接收多少条消息
确认发布:
单个确认发布:
批量确认发布:
异步确认发布:
需要写一个监听器
如何处理异步为确认消息?
在开启消息发布确认下面,写一个线程安全有序的一个哈希表 适用于高并发的情况下
之后在发消息的时候进行记录,每发一次消息记录一次
删除已经确认的消息
RabbitMq交换机的作用
之前说的都是简单模式,不需要交换机
下面说的就是发布订阅模式,需要交换机
交换机的概念:
交换机类型:
临时队列:就是不做持久化的,结束之后队列将被自动删除