之前在自己的项目中用到Kafka、RocketMQ等消息队列,仅仅用于系统消息通知,RocketMQ作为代理人的作用,但是一直不知道消息队列是怎么个解耦法?
系统崩溃
先看一个生活中的场景,小明想买一台游戏机,正好抖音直播间搞活动,于是搜索自己想要的游戏机,点击商品浏览价格。
首先,请求会先到搜索商品这个服务上,并记录搜索行为,点击商品的时候,又记录了我们的点击商品,这些数据最终都会通过计算分析,为的是下一次推送更准确的信息。
而小明的搜索行为记录和点击行为记录可以记录在存储日志中。
但是,但是,如果负责记录存储的数据库挂了,这个流程就会崩溃。
解耦
首先我们来分析一下系统为什么会崩溃?
因为存储服务挂了。这一个挂了,整个搜索商品->点击商品的流程都会受到影响。说白了,就是耦合度太高。
所以我们要解耦。用什么来解耦?
你猜猜什么中间件的作用是解耦?
消息队列登场。
消息队列可以看成一个中间人,把获取到的这些记录都推送到存储服务中。存储服务挂了、日志没有了、服务器坏掉了。但是还好,我们有消息队列,只要消息队列没挂,整个系统依然能照常运行,也依然能知道用户信息和系统信息。
是的,消息队列还适用于日志存储。
服务能力有限
再来看一个案例,就是秒杀商品,同一秒可能有几千个用户在抢购,但是订单只能同时处理10个请求,面对庞大的请求量,订单该如何处理?
解决方案:用消息队列削峰。每次只获取10个请求处理。