5. 为什么使用消息队列进行异步处理?
这个应该对于大多数开发者,这是最最最核心的用途了!!!
传统模式下,如下图所示:
传统模式
A 系统需要
串行
逐个
同步
调用系统 B、C、D 。这其中会有很多问题:
- 如果每个系统调用执行是 200ms ,那么这个逻辑就要执行 600ms ,非常慢。
- 如果任一一个系统调用异常报错,那么整个逻辑就报错了。
- 如果任一一个系统调用超时,那么整个逻辑就超时了。
- …
引入消息队列后,如下图所示:
新模式
通过发送 3 条 MQ 消息,通过 Consumer 消费,从而
异步
并行
调用系统 B、C、D 。
- 因为发送 MQ 消息是比较快的,假设每个操作 2 ms ,那么这个逻辑只要执行 6 ms ,非常快。
- 当然,有胖友会有,可能发送 MQ 消息会失败。当然,这个是会存在的,此时可以异步重试。当然,可能异步重试的过程中,JVM 进程挂了,此时又需要其他的机制来保证。不过,相比串行逐个同步调用系统 B、C、D 来说,出错的几率会低很多很多。
另外,使用消息队列进行异步处理,会有一个前提,返回的结果不依赖于处理的结果。