消息队列(Message Queue),从广义上讲是一种消息队列服务中间件,提供一套完整的信息生产、传递、消费的软件系统,如图1-1所示。
图1-1
消息队列所涵盖的功能远不止于队列(Queue),其本质是两个进程传递信息的一种方法。两个进程可以分布在同一台机器上,亦可以分布在不同的机器上。
众所周知,进程通信可以通过RPC(Remote Procedure Call,远程过程调用)进行,那么我们为什么要用消息队列这种软件服务来传递消息呢?
下面我们以春节订火车票为例进行说明,流程如图1-2所示。
拿到年终奖了,准备买车票带着媳妇儿回家过年。你打开12306手机App开始做如下操作:
第一步:输入车票信息,发送订票请求。
起点站:北京。
终点站:成都。
出发时间:腊月29晚上8点。
票数:2张。
座席:硬卧。
第二步:单击“预订”按钮,12306 App界面开始转圈圈。与此同时全国3亿人民也在和你一起做相同的事情。
第三步:3s后,应用告诉你订票失败。
第四步:你修改车次,重新发送订票请求。应用重复第二步继续等待。又一个3s后,12306 App告诉你订票成功。
图1-2
12306 App在处理图1-2中的逻辑时,会遇到以下挑战:
(1)今天这个车次只售出4000张票,而实际有30万人发送了订票信息,如果逐一请求处理,那么90%以上的人都将要耗时3s来等待,怎么办?
(2)下游有 20 个系统需要在订票成功后进行通知,如果逐一调用这些系统的接口进行通知,而其中一个通知任务执行失败,那么已经通知成功的任务会怎样?
(3)12306 App架构会不断调整,当数据结构发生变化时,下游20个系统都随着一起变化吗?
以上只是随机列举了一些常见的问题,如何才能优雅地处理呢?
答案是:消息队列!