版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
MQ简介
什么是MQ 跨进程的消息队列,主要角色包括生产者与消费者。 生产者只负责生产信息,无法感知消费者是谁,消息怎么处理,处理结果是什么。 消费者负责接收及处理消息,无法感知生产者是谁,怎么产生的。
作用及意义
1.消息异步:
上游直接调用下游
缺点:
- 上游关注执行结果,但执行时间很长
- 上游需要同步等待下游执行结果
- 下游系统故障导致上游系统无法使用
- 下游增加需修改上游代码
使用MQ调用(异步)
使用MQ的优点:
- 上游无需等待下游执行完毕,加快上游响应速度
- 下游系统故障不会影响上游系统的运行
- 增加下游只需订阅 MQ
2.解耦
服务解耦:系统解耦,用户系统或者其他系统需要发送短信可以通过 MQ 执行;很好的将 用户系统 和 短信系统进行解耦;
采用MQ的优点是:
- 不需要预留 buffer,上游任务执行完,下游任务总会在第一时间被执行
- 依赖多个任务,被多个任务依赖都很好处理,只需要订阅相关消息即可
- 有任务执行时间变化,下游任务都不需要调整执行时间
3.削峰
请求高峰期
举个例子:系统A一天中大部分时间每秒请求并发数量就 100 多个,但是中午12点-1点每秒请求并发量就飙升到 10000 多个,但是系统每秒最大能处理的请求量只有 1000 多。
-
不使用MQ
这个时候如果让系统硬抗会导致系统挂掉
- 使用MQ
通过使用 MQ 达到限流的效果,系统无法处理的请求会堆积在 MQ 中,高峰期过后系统可以继续消费 MQ 中的请求。
使用MQ的优点:
系统不会因为高峰期的请求量挂掉
引入MQ带来的问题:
-
可用性降低
系统引入的外部依赖越多,越容易挂掉,MQ 挂掉之后会导致整个系统不可用。
-
复杂度提高
重复消费、消息丢失、消息的顺序性等这些都是引入 MQ 之后需要考虑的事情。
-
一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,就会导致数据不一致。