MQ的深入理解
MQ的作用:
解耦合,降低系统与系统之间的频繁改动
MQ的特点:
复杂的系统解耦合 (主系统将数据放入mq,子系统需要的时候直接从mq中取出数据)
复杂链路的异步调用(将必要的链路执行完,非必要的放入MQ,再从mq中取出来执行. 保证系统的高效运行)
顺势高峰的削峰处理 (系统在某天的某个时间段请求很多,我们可以放入mq,以每秒1000的请求执行,减少服务器的使用)
MQ的问题:
系统调用MQ失败
网络故障消息丢失 或者 消息重复发送
幂等性:
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。
这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
可靠消息一致性:
上游服务器 > MQ > 下游服务器
上游服务器与下游服务器都对一个数据库进行操作,记录此次调用MQ的状态
上游服务器发完消息后 状态为待确认
下游服务器处理消息结束后 更改状态为 已完成
****
中间任意一方出问题 都会一起回滚
如果数据库里更新消息的状态失败了,那么就抛异常退出了,就别投递到MQ;
如果投递MQ失败报错了,那么就要抛异常让本地数据库事务回滚。
这俩操作必须得一起成功,或者一起失败。
MQ100%保证数据不丢失
channel.basicConsume()方法,传入的第二个参数:true,其实就是一个关键的参数。
这个true就代表了一个核心的含义,他的意思是,RabbitMQ只要把一个消息投递到仓储服务手上,立马就标记这个消息删除了。
这里我们将第二个参数设置为false ,即MQ不会在发出消息后即刻删除消息