7小时上线1个秒杀系统!!!!

Wesley13
• 阅读 569

  前言 

自2020年1月,新型冠状病毒肺炎被证实人传人后,无论是普通民众还是政府部门,都想着怎么去控制病情。而口罩成为防疫病情的第一需求,口罩很多时候一罩难求,是全国人民的刚需产品。

我算是半个湖北人,年前因为各种因素没去湖北,但身为一个灾区的亲属,一直在想:作为一个架构师,如何用自己的所学为疫情中的人们出一份力?碰巧2月底,我收到了一个地方政府口罩预约系统的优化援助信息,当时心里很是高兴,我终于也能除了关注、捐款外,用自己的所长贡献出更大的力量!

需求收集

01 /  需求

口罩在疫情期间是一个全民性的需求,该地方政府每日会采购一批口罩供应市场,市民们采用线上预约的方式进行抢购,由于预约人数过多,现有的口罩预约系统无法支持高并发的抢购,急需进行优化。需求如下:

1. 该地有百万人口,每日供应口罩量将达到几十万个以上,系统要求最高支持十万级以上人同时预约。

2. 政府为了满足公平性,采用在线多端预约的方式:每日不定时开放预约,并更新销售网点。

3. 每个预约成功者可到定点网点一次性采购5个口罩。

4. 凡预约成功者,自预约成功之日起5日后才可重新预约。通过预约人的身份证和手机号双限制。

5. 口罩预约是一个民生急需需求。要求预约系统能够稳定,快速上线。

6. 现有硬件资源有限,暂时不考虑变更。

02 /  系统现状

当时的口罩预约系统是一个使用PHP语言实现的完整后台管理系统。

视图层:因为PHP是快速建站的首选,所以是没有前后分离的。

存储层:原先使用Access数据库,后面因为预约人数太火爆,改用MySQL。

 需求分析

针对第一点需求。我们可以分析到:百万人口级别的市场需求,最高10万级别的预约记录。是一个高并发的写请求,如果直接入库的话,对于MySQL有比较大的性能压力,而且也非常浪费资源。更何况一开始还使用Access 数据库。所以我们只可以选择异步批量插入数据库来保障需求。

针对第二点需求。我们可以分析到:这其实是一个秒杀行为。对于秒杀,因为有各种限制和库存的处理,为提高市民体验性,所以我们需要采用内存秒杀处理。

针对第三、四点需求。我们可以分析到:需要有黑名单机制、商品扣除校验等业务需求。

针对第五点需求。我们可以分析到:原有系统的峰值波动不稳定性,已经引起公众的不满,有一定的投诉量。所以必须保证峰值的高可用和流畅度。

针对第六点需求。我们可以分析到:身为架构人员,要做的就是降本增效的设计。怎样将有限的资源更大利用化其实是咱们最大的工作。

  架构方案设计 

因为是一个性能优化的援助,所以可以确定为遗留系统改造的需求。从架构师的思维出发,先进行总体架构的设计模式选择。针对遗留系统的改造,我们通常选择绞杀者模式、修缮者模式。

01 /  绞杀者模式

绞杀者模式是指在遗留系统外围,将新功能用新的方式构建为新的服务。 随着时间的推移,新的服务逐渐“绞杀”老的遗留系统。

流程如下:

7小时上线1个秒杀系统!!!!

02 /  修缮者

就如修房或修路一样,将老旧待修缮的部分进行隔离,用新的方式对其进行单独修复。 修复的同时,需保证与其他部分仍能协同功能。

大神Martin Fowler 在 《branch by abstraction》有详细的介绍,流程如下:

7小时上线1个秒杀系统!!!!

绞杀者模式适合对于那些老旧庞大难以更改的遗留系统进行全局改造。然而我们接收的是一个优化援助,是一个紧急的事情。那么我们只能 选择修缮者模式 。

 详细设计 

现有系统有三张表关系到秒杀的基本业务(不含安全风控)。

1. 配置表,口罩的数量配置表

2. 网点表,记录网点信息

3. 登记表,记录购买用户信息

表设计如下:

配置表主要有id、日期、总数、余数、状态(0-过期,1-开放,2-关闭)

网点表主要有id,名字,地点,排序

预约表主要有id,姓名,身份证,手机号,日期,网点id

系统有完整的前后台及一些运维风控设置,时间又比较紧张的前提下,咱们使用修缮者模式将秒杀场景隔离出来,使用独立的项目进行执行,协同原有的后台进行支撑。

登记流程:

7小时上线1个秒杀系统!!!!

从流程中我们发现预约的瓶颈有以下几点:

1、 预约页面的初始化,需要余量展示以及销售网点的展示。高并发下有一定的性能的损耗,影响客户的体验度。

2、 黑名单校验,原本通过数据库查询来限制。一样有性能损耗,影响预约流畅度。

3、 抢购预约,大量数据库插入,数据库连接不足。引起系统崩溃,系统可用性及其低下。

根据瓶颈,我们分析以下,如果全内存加载:

1、 每条网点信息在UTF8MB4下会占用1KB。最多千条,全内存加载1M。因为存在后台更新网点,日更级别。使用修缮者模式+快速上线,先不做系统对接。所以可以定时异步全刷新网点缓存,更新频率根据实际分析,每30分钟刷新一次。

2、 黑名单校验,通过身份证和手机号来限制,计算下存储空间:

每个限制:11 + 18 = 29B

平均记录数:10万

天数:5天

合计29 *10万*5  大约15M。

结论:完全可以内存加载。

即使上升一个量级,100万登记也才150M。

3、 数据插入在秒杀流程是一个超高频的操作,也是性能的最大屏蔽。所以我们可以采用异步批量插入数据的形式进行优化 。

  伪代码实现 

01 /  预约逻辑

7小时上线1个秒杀系统!!!!

02 /  批量更新逻辑

7小时上线1个秒杀系统!!!!

7小时上线1个秒杀系统!!!!

03 /  黑名单加载机制

7小时上线1个秒杀系统!!!!

04 /  网点加载机制

7小时上线1个秒杀系统!!!!

05 /  配置异步刷新机制

7小时上线1个秒杀系统!!!!

06 /  缓存静态变量类

7小时上线1个秒杀系统!!!!

07 /  异常处理机制

因为是单Tomcat,为了防止系统故障,使用了优雅停机及Tomcat 崩溃恢复mock

7小时上线1个秒杀系统!!!!

  成果展示 

前后经过7小时的优化,完成了预约单功能的修缮协同。

优化后的页面如下:

7小时上线1个秒杀系统!!!!

测试结果如下:

7小时上线1个秒杀系统!!!!

生产运营环境:

上线当天平稳支撑了80000次并发的预约。全程改造不加任何中间件,在原有的服务器和软件上,独立部署一个Tomcat,使用重定向协同完成对客户的无感知预约。

·end·

奈学教育科技

技术人成长之路的指路人

7小时上线1个秒杀系统!!!!

感谢点在看支持创业👇

本文分享自微信公众号 - 川聊架构(gh_44ec4115d261)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
金三银四该准备起来了?
020年是不平凡的一年,一场突如其来的疫情改变了很多人的人生轨迹;作为一名互联网程序员来说,最大的感受是不是某某公司有裁员的消息,之前网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势“。我们不可否认,从去年年底开始,疫情就导致了很多企业陷入危机,继而停发薪资、变相裁员,在如此“难搞”的大环境下,对程序员
Wesley13 Wesley13
3年前
MP4 视频“只闻其声,不见其人”,是怎么回事呢?
艾瑞巴蒂大家好,我二狗子又来啦!这段时间关于疫情的好消息不断,各个地区的疫情都得到了有效的控制,做到了新增病例个位数增长甚至连续多天零增长!这不,二狗子也终于可以出村回到大城市上班啦!由于要坐很久的火车,二狗子不光备好了口罩和手套,申请好了绿码,也下载了自己最爱的电视剧《回家的诱惑》准备消磨时间,温习一下“品如的衣柜”。想到能和洪世贤度过这漫长的几个小时,二
Wesley13 Wesley13
3年前
35岁,真的是程序员的一道坎吗?
“程序员35岁是道坎”,“程序员35岁被裁”……这些话咱们可能都听腻了,但每当触及还是会感到丝丝焦虑,毕竟每个人都会到35岁。而国内互联网环境确实对35岁以上的程序员不太友好:薪资要得高,却不如年轻人加班猛;虽说经验丰富,但大部分公司并不需要太资深的程序员。但35岁危机并不是不可避免的,比如你可以不断精进技术,将来做技术管理或者
Wesley13 Wesley13
3年前
37岁程序员失业投500份简历就3次面试猎头:超35岁不要
37岁程序员失业120天,投了500份简历就3次面试,猎头:超过35岁都不要在职场中,都说互联网吃青春饭,而35岁就是一个门槛,一旦到了这个年龄找工作都非常难,甚至被公司裁员的风险都很大,其实一个现象也不难发现,互联网公司几乎都是年轻化,高龄员工很少,这也算行业趋势。最近,一位程序员在职业论坛留言,分享了自己面试的经历,“37岁程序员失业120天,投
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Stella981 Stella981
3年前
Python 教你一行代码给头像戴上口罩
前言2019年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的诉求,不如开发一个简单的程序来实现这个需求,也算是帮助设计姐姐减少工作量。于是花了些时间,写了一个叫做facemask\1\的命令行工具,能够轻松的
Wesley13 Wesley13
3年前
AAAI 2020「自然语言处理(NLP)」【哈尔滨工业大学】多任务自监督学习的文本顺滑
喜欢我们,点击上方AINLPer,关注一下,极品干货即刻送达!转载:哈工大SCIR各位小伙伴,最近全国各地陆续发现新型冠状病毒感染的肺炎疫情,又赶上春节,大家出门请注意戴口罩,做好防护~~引言现有的不流利检测方法大多严重依赖人工标注的数据,而在实践中获取这些数据的成本很高。为了解决训练数据的瓶颈,本文研究了
Stella981 Stella981
3年前
PingCAP 的 5 年远程办公实践
前言2020年的春节注定是一个不平凡的春节,全国都在抗击新型冠状病毒肺炎。除了不出门,勤洗手,戴口罩之类的常规操作,我们就在想,在这个大背景下,我们还能够做哪些事情?考虑到春节假期临近结束,返程的旅途中可能会加大传染的概率,延长隔离时间、远程在家办公也许是普通群众能给国家在这场战役中做的最大贡献。然而在我们国家,暂且不论别的行业,至少我们所在
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这