消息队列一|从秒杀活动开始聊起消息队列
削峰填谷,异步处理
秒杀活动中为何要使用到消息队列?
先说结论,秒杀活动并不是常规的活动,因此考虑到资源成本,以及服务稳定性,使用消息队列更佳。
假设某电商平台开办一场秒杀活动,活动有1000个性价比高的商品。参与该场活动的用户会在活动开始前的几分钟进入页面。
频繁的刷新,以及后面开始的秒杀活动,都需要查询商品的库存信息,绝大多数是读请求,因此我们需要使用缓存来扛住。
这边说的缓存,包括使用CDN缓存和nosql缓存。
一些静态的图片和视频,可以通过CDN的方式缓存,CDN 即内容分发网络,部署在距离终端用户最近的网络服务商,用户的网络请求总是先到达他的网络服务商那里,在这里缓存一些静态图片和视频,可以就近以最快的速度返回给用户。
一些商品信息的查询请求,可以使用nosql的缓存,如果不希望请求到对应的web 服务,可以通过在网关代理层直接请求到nosql缓存。
秒杀成功的请求,进入下单流程,这部分请求相比日常的请求量,也是一个瞬时的高峰写请求,这样高峰的写请求,对于数据库来说,也是比较大的压力,同时也使得响应延迟加剧。可能有的人会说,可以通过分库分表来解决。没错,分库分表一种解决方式,只不过这种方式增加了数据维护的复杂度,分库分表之后,想通过非分库分表字段去查询数据库,就要遍历所有库和表。如果需要批量查询,也要跨库跨表去查询,性能也是个问题,另外即使分库分表,如果平时没有预留多几倍的分库和分表,遇到这样的活动,还是要考虑扩展更多的分库来处理写流量,这样的扩展,还需要考虑数据迁移的问题。
因此,分库分表大多时候是一个最后的兜底方案。在这个场景下,比较好的方式,我们可以通过消息队列来扛住下单的高峰写请求,这也是消息队列的一个很常用的使用场景,削峰。即通过异步处理,将短时间高并发产生的食物消息存储在消息队列中,从而削平高峰期的并发事务。使用消息队列后,用户请求的数据发送给消息队列后立即返回,由于消息队列服务器的处理速度远快于数据库,因此用户的响应延迟也能得到有效的改善。同时消费消息的的服务也是可控的服务数量,因此不会对数据库有过大的压力。
解藕合
除了削峰和异步处理,消息队列还有一个使用场景是解耦。
很多公司都有大数据团队专门用于分析用户群体的喜好,活动促销的效果等,以便后续做一些推荐和更好的促销。
那就需要把用户下单相关的数据推送给这些团队,一种方式是这些团队提供同步接口来接收数据,但是这种方式耦合度高,会有两个问题:
1 一旦接口出现故障,直接影响到下单服务,从而影响用户的购买。
2 如果数据系统需要新的数据字段,下单系统也要跟着调整接口参数。
这种场景我们可以直接使用消息队列来降低下单系统和大数据系统的耦合度,下单系统可以把完整的数据发送到消息队列,大数据团队可以按需获取,这样即使大数据系统出现问题,也不会影响到下单系统,另外也可以按需获取需要的数据。
引入消息队列带来的问题
上面通过秒杀活动介绍了消息队列的几个作用:削峰,异步处理,解耦合。可以用来提升系统的稳定性和性能。但是引入了消息队列,系统的流程变长,复杂度也跟着变高,因此也带来一些新的问题,如何做到消息不丢失?如何做到消息不重复?消息堆积了,处理就延迟了,要怎么解决?消费者如果扩容,消息还能保证被顺序消费么?另外我们常听到的消费者扩容,会重平衡,那什么是重平衡,重平衡会带来什么问题呢?在后面的文章中,我们会继续讨论这些问题。
欢迎关注我的技术公众号:
消息队列一|从秒杀活动开始聊起消息队列相关推荐
- 【Redis消息队列实现异步秒杀】--Redis学习笔记08
前言 秒杀业务的优化思路: 先利用Redis完成库存余量.一人一单判断,完成抢单业务 再将下单业务放入队列中(阻塞队列,消息队列),利用独立线程异步下单 基于阻塞队列的异步秒杀存在哪些问题? 内存限制 ...
- 聊聊Redis消息队列-实现异步秒杀
一.前言 消息队列(Message Queue), 字面意思就是存放消息的队列,最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也被称为消息代理(Message Broker); 生产者 ...
- 【Redis学习08】Redis消息队列实现异步秒杀
文章目录 1. 消息队列 1.1 基于List结构模拟消息队列 1.2 基于PubSub的消息队列 1.3 基于Stream的消息队列 2. 基于Stream的消息队列---消费者组 2.1 消费者组 ...
- 阿里、百度、美团都在用的‘’高并发秒杀系统‘’;抢红包、秒杀活动、微博热搜、12306抢票等高并发场景
"秒杀活动"."抢红包"."微博热搜"."12306抢票"."共享单车拉新"等都是高并发的典型业务场 ...
- 秒杀活动,提高性能,防止超卖,订单超时
目录 初步思考 秒杀活动 订单防止超卖 订单超时如何处理 初步思考 原文地址 前端:页面尽可能静态化,css/js合并,减少请求数 扩容:增加机器,提高处理请求能力 限流:应用限流(nginx,tom ...
- 【趁热打铁】秒杀活动
文章目录 秒杀的本质和目标 服务请求流程 浏览器 减少请求数量 减少非必要的数据加载 请求路径最短 浏览器缓存 验证码 缓存静态资源 限流.削峰.分层过滤 业务服务 减少依赖 动态扩容 缓存 局部削峰 ...
- 【硬核】秒杀活动技术方案,Redis申请32个G,被技术总监挑战了...
作为一名技术从业人员,性能优化是每个人的必修课 就像大学时期给漂亮妹子修电脑的绝招就是"重启电脑一样",性能优化也有自己的必杀技 你一定听过一句话:性能不够,缓存来凑!对,你没听错 ...
- 业务总结002:秒杀活动架构设计
一.秒杀商品模型 二.架构设计 2.1 Redis + MQ 缓存预热:秒杀商品一般时效性比较强,一场秒杀活动持续的时间不会很长,当在后台设置秒杀活动添加秒杀商品时,把商品对应的库存直接存到 Redi ...
- Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十篇,本篇 ...
- 高并发下商城秒杀活动的处理
秒杀抢购活动是现在很多商城常见的营销手段,小米抢购.淘宝的整点免单.聚划算等都是成功的例子. 从简单处着手,秒杀是很好理解的:设置要秒杀的商品的数量,抢完为止.但是,实际应用中一瞬间的高并发压力.以及 ...
最新文章
- 尺度空间理论与图像金字塔
- Linux内核 sysctl.conf 优化设置
- 采购部管理--餐饮原料的验收管理
- 树莓派4b上部署yolov3和v3-tiny记录带截图
- 商品管理后台发布商品时,规格值组合的前端交互的实现逻辑
- 2017.09.21学习总结
- 一个mysql复制中断的案例
- 强悍的命令行 —— 磁盘空间的查看与磁盘空间的释放
- array in java,ArrayList to Array Conversion in Java
- C语言标准库函数大全(ctype、time 、stdio、stdlib、math、string)
- 计算机考研英语北邮,北京邮电大学计算机考研复试经验
- 宝塔面板反向代理怎么设置
- 怎么用图片编辑器给证件照换底色
- STM32F103RCT6实验代码之ADS1115的使用
- uefi开发环境搭建
- scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
- 【卷积神经网络】12、激活函数 | Tanh / Sigmoid / ReLU / Leaky ReLU / ELU / SiLU / Mish
- overlayfs源代码解析
- c语言扫雷游戏构成原理,扫雷游戏的C语言实现
- Linux cat命令学习
热门文章
- 地级市面板数据(2000-2019)四:失业+进出口+工资+规上企业+房地产等(stata版)
- 移动互联网创业组织可持续发展模型
- 浅谈物联网的关键技术和难点
- iPhone自定义铃声(iOS12 + iTunes in macOS Mojave)
- leetcode237题解
- jQuery fadeIn() 方法
- JAVA程序员必备网站
- python怎么改路径_python更改路径
- 微信Android热补丁实践演进之路-andFix / ClassLoader / Tinker
- F5 GTM DNS 知识点和实验 6 -智能DNS算法