在同步转异步推送处理中,最常用到的就是消息队列,如图1-7-5所示。消息队列是一种临时存储消息和请求的存储介质,可以是内存,也可以是磁盘,主要用于系统或者模块间的消息传递。很多编程语言内部都有消息队列的实现,当然也有专门用于消息队列的技术组件,比如Kafka、RabbitMQ等。
图1-7-5
消息队列是在软件架构设计中用于系统或者模块间解耦的一种常见设计模式,在系统和模块之间建立了一个数据通道,实现了系统或者模块之间的解耦。通过削峰填谷和异步处理,避免了系统资源耗尽,尤其在高并发调用系统的情况下,系统可能会面临突然的大量请求,而消息队列可以缓冲这些请求,将它们临时存储在消息队列中,按照系统的处理能力按顺序逐步消费数据消息,平滑过渡高峰期的请求,避免系统超压崩溃或性能急剧下降。
我们以双11大促秒杀活动作为示例来说明,消息队列用来削峰填谷,对优化系统性能压力起到关键的作用,如图1-7-6所示。
图1-7-6
可以看到有了消息队列后:
· 很好地降低了数据库的压力,因为只有前100个请求需要查询和修改数据库的库存,当库存为空时,不需要做任何处理,直接返回用户。
· 秒杀系统可以根据自身的消费能力,合理处理数据。当库存为空时,后续收到的消息队列中的请求,可以直接返回,不需要做任何的逻辑处理,从而减少了系统资源的使用,提升了系统的并发处理能力。