5. 为什么使用消息队列进行异步处理?

这个应该对于大多数开发者,这是最最最核心的用途了!!!

传统模式下,如下图所示:

传统模式

传统模式

  • A 系统需要

    串行

    逐个

    同步

    调用系统 B、C、D 。这其中会有很多问题:

    • 如果每个系统调用执行是 200ms ,那么这个逻辑就要执行 600ms ,非常慢。
    • 如果任一一个系统调用异常报错,那么整个逻辑就报错了。
    • 如果任一一个系统调用超时,那么整个逻辑就超时了。

引入消息队列后,如下图所示:

新模式

新模式

  • 通过发送 3 条 MQ 消息,通过 Consumer 消费,从而

    异步

    并行

    调用系统 B、C、D 。

    • 因为发送 MQ 消息是比较快的,假设每个操作 2 ms ,那么这个逻辑只要执行 6 ms ,非常快。
    • 当然,有胖友会有,可能发送 MQ 消息会失败。当然,这个是会存在的,此时可以异步重试。当然,可能异步重试的过程中,JVM 进程挂了,此时又需要其他的机制来保证。不过,相比串行逐个同步调用系统 B、C、D 来说,出错的几率会低很多很多。

另外,使用消息队列进行异步处理,会有一个前提,返回的结果不依赖于处理的结果。