如何设计一个秒杀系统----学习总结

第一章学习总结——概览https://time.geekbang.org/column/article/40153

1.秒杀主要解决问题——并发读和并发写。并发读的核心优化理念是尽量减少用户到服务端来读取数据,或者让他们读更少的数据。并发写的处理原则是在数据库层面独立出一个库,做特殊的处理。另外针对秒杀系统做一些保护,针对意料之外的情况设计兜底方案,以防止最坏的情况发生。

2.从一个架构师的角度来看,要想打造并维护一个超大流量并发读写、高性能、高可用的系统,在整个用户请求路径上从浏览器到服务端我们要遵循几个原则,就是要保证用户请求的数据尽量少、请求数尽量少、路径尽量短、依赖尽量少,并且不要有单点。

3.秒杀的整体架构可以概括为“稳、准、快”(高可用、一致性、高性能)几个关键字。

所谓“稳”,就是整个系统架构要满足高可用,流量符合预期时肯定要稳定,就是超出预期时也同样不能掉链子,你要保证秒杀活动顺利完成,即秒杀商品顺利地卖出去,这个是最基本的前提。

“准”,就是秒杀 10 台 iPhone,那就只能成交 10 台,多一台少一台都不行。一旦库存不对,那平台就要承担损失,所以“准”就是要求保证数据的一致性。

“快”,“快”其实很好理解,它就是说系统的性能要足够高,否则你怎么支撑这么大的流量呢?不光是服务端要做极致的性能优化,而且在整个请求链路上都要做协同的优化,每个地方快一点,整个系统就完美了。

所以从技术角度上看“稳、准、快”,就对应了我们架构上的高可用、一致性和高性能的要求。

高性能:

秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。主要包含数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这 4 个方面。

一致性:

秒杀中商品减库存的实现方式同样关键。有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性。

高可用:

现实中总难免出现一些考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个 PlanB 来兜底,以便在最坏情况发生时仍然能够从容应对。

——————————————————————————————————————————————————————————————————————————————————

第二章学习总结——设计秒杀系统应该注意的五个(4要1不要)架构原则。https://time.geekbang.org/column/article/40726

1.数据量尽量少:请求数据和返回数据都要尽量少,以减少CPU使用。

2.请求数要尽量少:减少额外请求,如合并js、css等,首屏HTML内联所需的CSS、JS。

3.路径要尽量短:减少节点数,相互强依赖的应用合并部署。节点越少出错概率就越小,可用性就越高。所以缩短请求路径不仅可以增加可用性,同样可以有效提升性能(减少中间节点可以减少数据的序列化与反序列化),并减少延时(可以减少网络传输耗时)。

4.强依赖尽量少:给数据重要性分等级,尽量减少所要加载的数据。

5.不要有单点,要有备份,如设计分布式系统,关键点是把服务无状态话,避免将服务的状态和机器绑定,使服务可以在机器中随意移动。

架构是一种平衡的艺术,而最好的架构一旦脱离了它所适应的场景,一切都将是空谈。所以设计架构时上面几点只是方向,应该根据实际情况适当取舍。

补充:

答疑:

1 .本地cache用什么实现好呢?

本地cache一般就是用内存实现,如java用集合类型就行

  1. 通过什么方式往本地cache 写数据呢?

    用订阅的方式,在初始化时加载到内存

  2. 秒杀系统的及时性非常高,把库存写进cache ,怎么及时更新呢?

    有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,最终强一致性即可

    4.各QPS级别架构可能瓶颈点?

    不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里。

    5.单点是什么?

    单点就是一个状态值存储在一台机器上,这台机器挂了,这个状态就丢了,导致整个服务不可用。最常用的就是本机存储数据,而这个数据没有备份的情况

架构示例:

1-10万QPS级别架构设计示例图:

原文地址:https://www.cnblogs.com/ryanlamp/p/10133713.html

时间: 2024-10-05 04:26:02

如何设计一个秒杀系统----学习总结的相关文章

2017-5-26/描述一个高性能高可靠的网站架构——如何设计一个秒杀系统

一.秒杀的应用场景 电商网站的抢购活动.12306网站的抢票.抢红包. 二.秒杀的特点 1.秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增. 2.数据库的并发读写冲突以及资源的锁请求冲突非常严重. 3.秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功. 三.秒杀架构的原则 1.将请求拦截在系统上游,降低下游压力:秒杀系统特点是并发量极大,请求都压倒了后端数据层,但实际秒杀成功的请求数量却很少.所以如果不在前端拦截很可能造成数据库读写锁冲突严重,并发高响应慢,甚至导

如何在裸机下设计一个嵌入式系统架构?

如何在裸机下设计一个嵌入式系统架构? 如何不使用操作系统的情况下设计一个嵌入式系统的架构呢?比如串口数据如何接受,串口数据协议在什么地方解析,SPI总线的数据如何有效的接收?等等问题.如何设计,才能尽量保证各个模块的效率呢?自己有一些设计,想一起讨论下.比如串口的数据先在中断程序中放入一个大数组中,然后在主程序中解析接收到的数据,等等--还有哪些技巧呢? 关注者 157 被浏览 7,457 关注问题写回答 ?添加评论 ?分享 ?邀请回答?举报 ? 收起 8 个回答 默认排序? Tony Ho 嵌

如何设计一个RPC系统

版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qcloud.com/community RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型.使用习惯的约束,有大量的妥协和取舍之处.本文就是通过分析几种流行的RPC实现案例,提供

如何设计一个 RPC 系统

本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型.使用习惯的约束,有大量的妥协和取舍之处.本文就是通过分析几种流行的RPC实现案例,提供大家在设计RPC系统时的参考. 由于RPC底层的网络开发一般和具体使用环境有关,而编程实现手段也非常多样化,但不影响使用者,因此本文基本涉及如何实现一个RPC系统. 认识 RPC (远程调用) 我们在各种操作系统

我想做产品,我希望设计一个电脑系统的一个自动化管理程序

我希望能做一个电脑系统的程序,它能够,让我自定义的,选择是电脑上某些时候,自动的开启,自动关机,然后帮我充的,以保证秩序的顺序,打开我的某些程序,并进入到某些步骤,或者说保留我的某些不知道工作. 原因,因为,我们,作为一个如何现在现在画的现代化的一个工作,大概很多人都会与电脑经常打交道,甚至有非常多的人每天,的工作就是借助电脑来完成,所以说大家一定让他教他的时间非常多,然后在这个时候我们会开启不同的关机,不让他去打开电脑,浪费了很多时间和精力,去,降低我们的效率,如果说有一个程序能够帮我们实现,

面试题:如何设计一个权限系统?

前言 权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题. 目前在公司负责权限这块,所以对权限这块的设计比较熟悉,公司采用微服务架构,权限系统自然就独立出来了,其他业务系统包括商品中心,订单中心,用户中心,仓库系统,小程序,多个APP等十几个系统和终端 1.权限模型 迄今为止最为普及的权限设计模型是RBAC模型,基于角色的访问控制(Role-Based Access Contr

转:RBAC如何设计一个权限系统

前言 权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题.目前在公司负责权限这块,所以对权限这块的设计比较熟悉,公司采用微服务架构,权限系统自然就独立出来了,其他业务系统包括商品中心,订单中心,用户中心,仓库系统,小程序,多个APP等十几个系统和终端 1.权限模型 迄今为止最为普及的权限设计模型是RBAC模型,基于角色的访问控制(Role-Based Access Contro

一个秒杀系统的搭建(一)

新建父项目 youfanmiaosha2 pom文件 共有的依赖spring boot,spring boot有父依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xs

秒杀系统的思考方式与设计思路--左手隔离,右手分层

大家好,我是崔皓. 很高兴有这样一个机会和大家认识.我在IT行业从事软件开发工作十余年了,足迹涵盖企业服务,互联网,企业数字化转型等.工作之余热爱阅读和学习,希望能通过这个专栏和大家成为朋友. 开篇 本次专栏要给大家分享的是"如何设计秒杀系统",专栏共包括15章,本章是第一章.今天会给大家介绍以下内容: 秒杀场景的特征 隔离的设计思路 分层设计思路本章的讲解思路是,提出秒杀场景的特征,也就是理解什么是秒杀.然后介绍在秒杀系统设计的底线,有了底线才能保证进可攻退可守.最后介绍使用哪些方法