首页 系统架构 架构与思维:秒杀和竞拍的业务架构,永不过时的话题

架构与思维:秒杀和竞拍的业务架构,永不过时的话题

1 互联网架构越来越复杂?
为啥感觉互联网架构越来越复杂了,早期我们的系统,可能也就那么少部分人使用,大都是一些后台管理系统。
所以不用考虑很多东西,比如:
流量少,无需考虑并发问题
数据少,不用考虑什么索引优化、分库分表
访问不集中,不用考虑缓存、过载保护
如果数据不重要,不用考虑安全策略,甚至不用考虑容灾备份
可重复提交,所以不用关系幂等性
允许短暂宕机和定期关停维护,所以不用考虑多活架构
但是随着互联网的普及和用户的激增,为了应对流量增量带来的各种问题,我们的架构体系衍生出很多强大的技术方案。
2 什么是秒杀/竞拍业务
秒杀业务也是随着互联网电商的发展而不断普及的,我们来看看普通业务和秒杀业务的区别
2.1 普通的业务
微信的个人信息:个人的注册信息,公众号、视频号的基础信息,微信好友列表,微信群列表。这种是 1:1 的,一般也不会被别人看到。
微信朋友圈:你盆友圈公开的内容是可以被多个好友看到的,你也可以对应看到你多个好友的盆友圈。这种是 1:n 的,多读的一种场景。
2.2 秒杀/竞拍业务
只有少量的数据,却会在集中的时间段被一批人看到和抢购,集中式的高频读写。
业内也称为 群蜂请求 ,你可以想象下你捅了马蜂窝的场景。哈哈哈
典型秒杀/竞拍业务案例:
春运前的火车票开售那一刻,可能瞬间有千万级请求涌入
将来某个遥遥领先开售,可能是一秒售罄
这些业务场景有如下技术难点:
瞬时流量特别大,你的接入层、应用层、数据层等能否扛得住
大量流量涌入 对一个数据进行操作,怎么保证数据原子增减、顺序公平性,怎么保证数据不超卖
如何 保证数据安全,如防攻击、防刷数、保持幂等
如果使用 并发控制,如何保证不产生死锁
所以,一个优秀的秒杀业务架构,在现在的互联网业务中,是一个永不过时的话题
3 如何优化
这边只针对几个对秒杀业务有效改进的点做展开,什么集群动态扩容、流量控制、弹性伸缩、智能限流啊,可以参考我的这篇文章《千万级流量冲击下,如何保证极致性能》。
3.1 清除无效请求
尽量在前面就把一些无效请求给清理掉,所以这些操作Web前端 或者 App Client端做就行了,越前端越好,尽量不要伤害到服务端,比如:
未登录拦截
重复提交拦截(未响应则按钮置灰,直至响应或者5S超时才恢复,幂等保证)
频繁提交拦截(单用户一分钟不超过100次,避免AI刷机)
验证码拦截(避免AI刷数据、黑客攻击等)
参与条件拦截(可提前加载名单):如用户等级不够、注册未满3个月、用户进入黑名单等
3.2 服务端+缓存层做高效原子操作
公共数据做缓存
缓存是提升系统性能的重要手段。通过缓存热点数据,缓存还可以提高数据的访问速度,见很少对数据库的访问速度,提升用户体验。Redis单机每秒10w没什么问题,再加上多集群多副本模式。
原子操作保证秒杀的计数
在Redis中,高效地进行原子计数通常使用INCR、INCRBY、DECR、DECRBY等命令。这些命令都是原子操作,意味着在执行时不会被其他Redis命令打断,从而保证了计数的准确性和一致性。
# 计算已售卖1000台库里南
> INCRBY cullinan_counter 1000
# 获取当前售卖数量
> GET cullinan_counter
> 1000
# 超过1000,返回秒杀失败
队列保证请求有序进入
使用Redis的 Stream 队列功能。Stream 实际上是一个 key,你可以使用 XADD 命令向其中添加消息。
XADD mystream * field1 value1 field2 value2
这里 mystream 是 Stream 的名称,* 表示让 Redis 自动生成一个唯一的消息 ID。field1 value1 和 field2 value2 是消息的内容,你可以根据需要添加任意数量的字段。
如果你只有1000台库里南供抢购,那么第1001就不要进入队列了。
扩展阅读
缓存可以扩展阅读作者的这个系列的文章:★ Redis24篇集合
3.3 数据层做终兜底
经过上面的保证之后,到数据层的量就很少了,大概率就是你定额的商品数量同等的数量。
比如1000,数据库绝对的扛得住的。
唯一可以做的就是检查数量是否符合预期,这个可以创建约束或者触发器来实现。
3.4 全球式业务,单元化处理
有些人可能会说,我的商品全球售卖,那我的缓存中心、数据中心放哪里,如果放中国,那跨地域跨机房访问,在0.1微妙都能决定我是不是买得到,欧洲的客户铁定抢不到库里南了。
现在的做法一般是单元化隔离,比如:
A/B中心都有这样的缓存或者数据结构,配置中心统一下发配置。然后在各自的单元里面玩耍,互不干预。 秒杀业务千万不要想着跨地域+跨机房,用户存在不公平性。
4 写在最后
无效请求拦截,尽量在前端完成,避免走入后端,造成服务端压力
缓存支持高性能检索、原子计算和有序队列
数据层做存储兜底
分治原理:单元化隔离,避免集中处理

站心网

1 互联网架构越来越复杂?为啥感觉互联网架构越来越复杂了,早期我们的系统,可能也就那么少部分人使用,大..

为您推荐

微服务架构定义与特点总结

1. 定义微服务是一种架构风格,将应用程序拆分为多个小型、独立的服务,每个服务运行在自己的进程中,通过轻量级通信机制(如HTTP/REST)交互。每个服务围绕特定业务功能构建,可独立开发、部署和扩展。2. 特点独立..

谈程序员如何做好业务

前言技术能做两种事情,通过技术实现业务和通过技术支持技术。我们大部分时候做的是前者,养活我们的大部分也是业务。 近两个月,作为项目负责人角色从0到1经历了新项目的几个版本迭代,跨入了部分新领域,也有一定..

天天写业务代码,如何成为技术大牛?

不管是开发、测试、运维,每个技术人员心理多多少少都有一个成为技术大牛的梦,毕竟"梦想总是要有的,万一实现了呢"!正是对技术梦的追求,促使我们不断地努力和提升自己。然而"梦想是美好的,现实却是残酷的",很多..

比贫穷更可怕的,是你的穷人思维

有个朋友前段时间刚换了工作,钱多了,但离家却稍微有点远了。最近跟她聊天,她一直抱怨自己工作日都跟打仗似的,每天上下班挤公交换地铁,一早得送孩子上学,下班之后,还得买菜做饭,等忙活完安顿好,就已经到了晚..

架构与思维:微服务架构的思想本质

我们为什么需要微服务架构,它一定是为了解决我们某些问题才出现了。这篇文章我们讨论下微服务架构模式所解决的问题,带来的挑战,以及他的核心思想本质。1 早期的服务架构上图是一个典型的服务分层架构:Client: ..

一文搞懂SaaS架构建设流程:业务战略设计、架构蓝图设计、领域系统架构设计、架构治理与实施

大家好,我是汤师爷~SaaS架构建设是一项复杂的系统工程,不仅需要技术层面的实现,更要从业务战略、架构设计、治理与实施等多个维度进行全面规划。一个成功的SaaS架构可以帮助企业降低IT成本、提升业务灵活性、加快..

架构知识点(一)

执行阶段(Execution Stage)执行阶段是 CPU 流水线中的一个步骤,通常发生在取指阶段(Instruction Fetch, IF)和解码阶段(Instruction Decode, ID)之后。在执行阶段,CPU 会进行以下操作:执行算术或逻辑操作:..

一文搞懂架构设计的衡量标准:功能性、可用性、性能、可扩展性、安全性、协作效率、复杂度、成本效益

大家好,我是汤师爷~架构设计的首要目标是服务于业务需求。因此,我们不应该盲目追求所谓的"最厉害的"架构,而应该致力于寻找最适合当前业务环境和未来发展需求的架构方案。衡量架构的合理性是一个复杂的过程,需要..

架构知识点(二)

轮询调度(Round Robin Scheduling)是一种时间片轮转调度算法,主要用于多任务系统中。其基本思想是将所有任务排成一个队列,每次调度时,系统会从队列中取出下一个任务执行,直到任务完成或达到其时间片限制。当任..

每一个程序员,都希望能成为分布式系统架构师

有很多读者经常问我,程序员的学习、成长之路应该怎么规划,才能早日成为一名架构师。作为一个曾经的架构师,在我走上技术管理这条路之后,管理的团队越来越大,现在我管理的技术团队有一百多人,最大的体会就是操心..

服务架构进化论

1.原始分布式时代一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系统盛行之前,我们的前辈们就已经探索过使用多个独立的分布式服务共同完成一个大型的系统的实现方..

什么是微服务架构?它与单体应用程序架构有什么区别?如何在.NET中实现微服务架构?

微服务架构是一种软件架构风格,通过将应用程序拆分为一组小型、自治的服务来构建应用程序。每个服务都专注于解决特定的业务功能,并通过轻量级的通信机制进行交互。这些服务可以独立开发、部署和扩展,可以使用不同..

适合架构师阅读的书籍推荐

一、Software Architecture篇 这个领域没有什么"畅销书",可能读者中本来就是开发设计人员与项目经理占了多数,真正定位为架构师而且做的也是架构师工作的不多吧。 1.《Software Architect Bootcamp--软件架构师教..

什么是Kafka?Kafka架构原理

在《财富》 500强公司中,超过三分之一的公司使用Kafka。这些公司包括排名前十的旅行社,排名前十的银行中有七个,排名前十的保险公司中有八个,排名前十的电信公司中有九个,等等。LinkedIn,Microsoft和Netflix每..

系统架构7个非功能性需求

在软件系统里面,功能性需求是面向用户、详细明确的需求,由产品人员根据市场的需要提炼出来,是产品生命周期里最重要的一环。比如电商系统里面的优惠券功能,通常包含需求:优惠券分类、细分领券人群、核销优惠券等..

大型网站架构思路之二—分解

《大型网站构架优化思路之一简化》一文中我们讨论了简化,如果简化完毕,或者无法简化,那么就要考虑分解它了,那么如何去分呢?通常来说,可以从横向和纵向去分,也可以从软件和硬件去分,这个和我们构架的设计方..

ASP.NET Core微服务架构中使用RabbitMQ实现CQRS模式

微服务架构代表了软件设计的范式转变,将大型单体应用程序分解为更小的、可管理的服务,这些服务独立运行并通过定义良好的 API 进行通信。微服务架构概述在 C# 中,微服务可以是更大系统的一部分:using System;usin..

.NET 6.0支持ARM64架构的意义

.NET 6.0 支持 ARM64 架构具有重要的意义,主要体现在以下几个方面:扩大了 .NET 应用程序的运行平台:ARM64 架构是移动设备、服务器、物联网设备等领域的流行架构。.NET 6.0 支持 ARM64 架构,意味着 .NET 应用程序..

.NET架构师技术要求:掌握.NET平台和架构设计能力

作为一个.NET架构师,你需要具备以下技术要求:精通.NET平台:作为.NET架构师,你应该对.NET平台和相关技术栈有深入的理解,包括.NET Framework和.NET Core。你应该熟悉.NET编程语言,如C#,以及相关的.NET开发工具..

你如何设计一个可扩展的.NET应用程序架构?请描述你在这方面的思考过程和实践经验。

设计可扩展的.NET应用程序架构是为了满足应用程序在需求增长和负载增加时的可扩展性和性能要求。下面是我在这方面的思考过程和实践经验:需求分析:首先,我会进行需求分析,了解应用程序的功能需求和预期的负载。这..

发表回复

返回顶部