使用消息队列进行限流(上)

在公众号回复课程,免费获取JAVA全栈课程


做者 | 颜 群java

公众号 | 大数据和人工智能技术web


消息队列,Message queue,简称MQ。面试

顾名思义,消息队列就是一个 存放“消息”的“队列”,有着 FIFO 的特性。这里的“消息”实际就是“数据”的意思,所以消息队列自己就是一个简单的数据结构——队列数据库

在设计模式上,消息队列是“生产者-消费者”模式的一个经典实现编程

通常而言,用户就是请求的“生产者”,然后台服务就是请求的“消费者”。设计模式

用户只须要向MQ中生产请求,无需关心是谁来消费;后台服务也只须要从MQ中获取并消费请求,无需关心是哪一个用户在生产请求。所以,在使用了MQ后,生产者和消费者就没有了直接引用的关系;也就是说,MQ能够实现生产者与消费者的解耦,如图所示。服务器

    

更进一步,为了不高并发带来的延迟,生产者能够将下单请求以“异步消息”的形式发送MQ中,从而快速响应用户,提升用户体验。微信

MQ的一个重要做用就是:限流。网络

本文主要介绍:使用MQ进行限流的核心手段——削峰填谷数据结构

MQ能够把海量的请求延迟转发给各个后台服务器。

能够这样理解“削峰填谷”:若是没有MQ,海量请求将直奔服务器;但有了MQ后,海量请求会先暂存到MQ中(海量请求同时抵达时就是流量的“峰”值),以后服务器再将MQ中的海量请求逐步拉取过来并处理,即用“峰”值填补服务器在以后一段时间的“谷”值(若是不从MQ中拉取请求,服务器在没有数据处理时,并发量的监控线就像山谷同样处在低位)。

削峰填谷的具体实现方法以下:

在高并发场景下,能够把海量的用户请求当作“消息”存储到消息队列之中,以后秒杀系统的各个子系统就能够根据自身的性能,从消息队列中平稳的拉取固定数目的请求数,如图所示。

举个例子,假设某一时刻秒杀的并发请求量是 10 万,“子系统-A“的处理极限是 2 万、“子系统-B“是 3 万、“子系统-C“是 4 万,显然 A、B、C 三个子系统是没法同时承受 10 万的请求量。此时,就能够先将 10 万个请求存储到消息队列中(即入队),而后A、B、C子系统根据自身的能力,选择性的从消息队列中拉取必定数额的请求(即出队),具体就是“子系统-A”仅从消息队列中拉取 2 万个请求并处理、“子系统-B”拉取 3 万条、“子系统-C”拉取 4 万条,而后将剩余的 1 万条请求直接拒绝,或者等待A、B、C的第二轮出队操做。这样一来,各个子系统既能够充分的发挥本身的性能,也能防止因为超负荷的并发量形成的系统崩溃。


思考:在发送消息的过程当中,如何避免消息丢失、消息被重复消费,如何处理消息积压问题?

这些问题会在下篇文章中作解答,感谢阅读。



- 完 -

推荐阅读

答疑 | 高并发都要学哪些技术?

答疑 | 我是JAVA初级,有必要学架构设计吗?

Java小白到大神的心路历程(Java SE)

答疑 | 面试全对,却没offer?

答疑 | 背下这300字,面试就能加薪!


扫描上方二维码回复 课程
便可得到JAVA全栈教程合集 
30+课程掌握 95% 的开发技能

在“大数据和人工智能技术”聊天对话框回复如下关键词,可得到相关信息哟

回复【资料】获取JAVA全栈视频的配套资料

回复【最新课程】获取一门还没有公开的高级课程(不按期更换)

回复【提问】获取免费答疑方式

回复【课程】获取JAVA全栈视频教程 + 配套资料

回复【软件】获取经常使用的开发软件(逐步完善)

回复【亿级源码】获取本号做者出版的《亿级流量Java高并发与网络编程实战》一书配套源码

回复【javase获取JAVA视频教程

回复【数据库获取数据库视频教程

更多课程,逐步开放...


 以为有用,请点在看  ↓ 

本文分享自微信公众号 - 大数据和人工智能技术(Big_Data-AI)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索