秒杀场景设计

2023-09-21 13:05:39

1.活动页面静态化处理
没有到活动时间页面静态化处理避免访问服务端

2.使用cdn让用户可以获取就近的所需静态页面内容

3.限制用户同一时间点击次数

4.把商品库存提前放入redis,秒杀请求直接操作redis防止操作直接落库打崩数据库

5.使用lua脚本操作redis保证操作原子性,确保不会发生超买超卖。
具体就是先查看商品id是否存在如果不存在则直接返回失败,如果存在且库存大于0则扣减库存返回成功,如果库存等于0则返回库存不足。

7.使用redis分布式锁限制并发数量
redission枷锁

8.消息队列异步处理
真实秒杀场景分秒杀、下单、支付等三个模块

在这里插入图片描述
并发量最大的就是秒杀,下单和支付并发量并不是很高,所以架构设计时把下单和支付从秒杀主流程中拆分出来,秒杀和下单使用mq异步通信。
在这里插入图片描述
8.1 防止mq消息丢失
在这里插入图片描述
消息发送前先使用消息发送记录表记录一下并且赋予状态为待处理,当下游服务消费完消息后调用消息回调接口更新消息发送记录表中的信息状态为已完成,启用job机制定期检查发送表中的消息状态,如果是未完成的状态且超过一段时间则重新发送,然后删掉状态为已完成的消息。

8.2 重复消费问题
消费者实现一个消息处理表,消费后把消息放入消息处理表中,每次重新拿到消息后判断是否已经在消息处理表中,如果在就丢弃不做处理,不在的话就执行后续下单操作执行完成就把消息放入消息处理表中。注意下单和写消息处理表要放在同一个事务中保证原子性操作。
在这里插入图片描述

8.3 垃圾消息处理
如果回调接口异常会使得消息在消息处理表中长时间停留且会不停的再往下游重复发送,所以要在消息处理表中记录消息重发次数回头停留时间,根据重发次数和停留时间做一个权衡策略限制垃圾消息重发。

8.4 延迟消费问题
如果用户长时间未支付,则需要取消订单,这里可以使用rocket mq的延迟队列,生成订单后状态为待支付,这时候向延迟队列发送消息,经过订单最大延迟时间后消费延迟消息,拿到消息查询订单状态如果订单状态为待支付则取消订单,若状态为已支付就修改订单状态为已支付。
在这里插入图片描述

9.如何限流
使用redis对用户或者对某个ip做限流,如果某一个用户或者ip访问次数过多,那么就启用验证码机制。

更多推荐

王江涛十天搞定考研词汇

学习目标:考研词汇学习内容:2023-9-17第一天考研词汇学习时间:2023-9-17学习产出:Aintellect智力;知识分子intellectual智力的;聪明的intellectualize使...理智化,对...做理性探索contempt轻视,蔑视contemptible可鄙的,可轻视的contemptuo

【企业级SpringBoot单体项目模板】 —— 全局配置

😜作者:是江迪呀✒️本文关键词:SpringBoot、模版、企业级☀️每日一言:你坚持下来了,而别人坚持不下来,这就是你的资本。文章目录一、全局异常配置1.1全局异常处理1.2处理业务异常类1.3状态码枚举类1.3使用二、返回体配置2.1返回体类2.2抽象controller2.3使用上回我们创建了一个SpringB

XC3420B 低压降压IC 5V降3.3V 大电流降压IC 开关频率1.5MHZ

XC3420B是一个1.5MHz的恒定频率,电流模式降压转换器。它非常适合需要单节鲤离子电池提供高达2A电流的便携式设备,同时在峰值负载条件下仍能实现90%以上的效率。XC3420B也可以运行在100%的低压差操作占空比,延长便携式系统的电池寿命,而轻载操作提供了非常低的输出纹波噪声敏感的应用。XC3420B可提供高达

在月球上看地球和太阳是怎么转的?

文章目录参数初始化运动模型绝对坐标系以太阳和地球为中心以月球为坐标原点参数初始化众所周知,地球围绕太阳转,月球围绕地球转。但在地球上看,月亮和太阳都绕着地球转,那么如果我们是土生土长的月球人,我们看到的是谁绕着谁转呢?日地月就是典型的三体系统,其中太阳质量为1.989×1030kg1.989×10^{30}kg1.98

三维模型3DTile格式轻量化在网络传输中的重要性分析

三维模型3DTile格式轻量化在网络传输中的重要性分析三维模型3DTile格式轻量化在网络传输中扮演了至关重要的角色。随着数字化和虚拟化技术的发展,越来越多的应用需要通过网络来获取和分享大规模三维地理空间数据。但由于这类数据通常具有高精度和大尺度等特点,其数据量巨大,直接传输原始数据会消耗大量的网络带宽,严重影响传输效

Swift 5.9 有哪些新特性(二)

文章目录前言Noncopyable结构体和枚举结束变量绑定的生命周期makeStream()方法添加sleep(for:)到ClockDiscardingtaskgroups总结前言虽然Swift6已经在地平线上浮现,但5.x版本仍然有很多新功能-更简单的if和switch用法、宏、非可复制类型、自定义actor执行器

2603. 收集树中金币

给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处有一个金币。一开始,你需要选择树中任意一个节点出发。

Java 21 新特性:Record Patterns

RecordPatterns第一次发布预览是在JDK19、随后又在JDK20中进行了完善。现在,Java21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。recordPoint(intx,inty){}staticvoidprintSum(Objectobj){if(objinstanceofPoint

1. 两数之和

目录给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],target=9输出:[0,1]

【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)

本站以分享各种运维经验和运维所需要的技能为主《python零基础入门》:python零基础入门学习《python运维脚本》:python运维脚本实践《shell》:shell学习《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战《k8》暂未更新《docker学习》暂未更新《ceph学习

从统计语言模型到预训练语言模型---神经网络语言模型

随着神经网络的发展,神经语言模型(NeuralNetworkLanguageModels,NNLM)展现出了比统计语言模型更强的学习能力,克服了N-gram语言模型的维度灾难,并且大大提升了传统语言模型的性能。神经网络先进的结构使其能有效的建模长距离上下文依赖,以词向量(WordEmbedding)为代表的分布式表示的

热文推荐