什么是消息队列?
1 | 在计算机科学中,消息队列是一种进程间通信或同一进程不同线程间的通信方式,软件的贮列同来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信方式,每一个贮列中的详细记录包含详细说明的数据,包括发生的时间,输入设备的种类以及特定的输入参数,也就是说消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。 ——————摘自wikipedia |
为什么要引入消息队列?能解决什么问题?
消息队列是很重要的分布式中间件,能够应用于流量削峰填谷、应用间解耦、异步处理、消息通讯场景.
流量削峰
很多电商网站都会搞整点秒杀的优惠活动,如果按照传统实现方案,通过传统方式进行秒杀下单,所有的查询创建在秒杀活动开始的时候一瞬间全都打到db server上面去,流量暴增,数据库立马就跪了,服务全跪。
显然传统方式是无法应对这种瞬时激增的流量的,那么这时候就要引入流量削峰的方案了,引入消息队列,所有的下单信息发送到消息队列中,并给定一个当前系统能承受的最大请求数量,当超过这个最大数量,多余的流量被丢弃,将被削掉流量的用户引导至错误页面,削峰完成,虽然丢失了一部分流量,但是保证了流量超出系统承受能力的时候,系统不至于崩溃.
应用间解耦
案例:系统A提供了一些数据,此时系统B对这些数据比较关注,此时的技术方案是A系统直接将数据通过接口调用发送给系统B,这时问题解决了,A系统成功为B系统提供了数据。
存在的问题:
系统A和系统B都存在宕机的可能性,服务的高可用性没有办法保证,通过接口调用的方式存在失败的可能性.
如果这时又来了系统C,D,E,这时按照刚才的方案,系统A又需要调用系统C,D,E,这时候系统A的开发人员肯定要疯了,同样的逻辑要写3,4次.
解决方案:
这时候如果使用消息队列,系统A的开发人员就解脱了,系统A只需要应用消息队列中的发布订阅模式,将数据简单地丢到消息队列中,对此数据关心的系统直接从消息队列中取出这份数据即可.
异步处理
案例:假设现在有一个简单的登录场景,假设进行登录的时候需要执行3个操作,调用user服务的查询用户接口A,记录访问日志存库操作B,发送推送消息操作C,这三个操作依次耗时20ms,30ms,50ms
如果同步处理的话那么在后端服务内的耗时至少是三个操作的总和,返给前端的时候还要计算上TCP连接建立的时间,实际上这个操作中,有一些操作是对于前端交互是毫无关系的,比如操作B和操作C,用户点击登录时
用户所关心的是立即登录,并不关心记录日志,发送推送消息这些操作,这些操作完全可以异步处理,非核心的业务逻辑或不要求立刻返回结果的任务完全可以异步执行,而这时就可以使用消息队列来完成这个操作。
消息通讯
消息队列还可以应用于线程间通信或者进程间通信,或者应用于纯消息通讯,比如点对点的聊天,或者聊天室这种发布订阅模式。