草庐IT

热点和秒杀来临前要做的5件事

编程一生 2023-03-28 原文

记得当年《甄嬛传》热播,调用了我们团队的媒体资讯接口。接口被调用挂了。当时虽然我不负责那一块,只是目睹了当时大家在临场解决问题的紧张一幕。但是这件事在我心里埋下了种子,从此追求高可用、高稳定成为职业发展的方向。

 

今天咱们就来聊一聊热点和秒杀前要做的5件事。这5件事是按时间顺序排列出场。

 

应急演练

 

无论对一个软件系统运行原理掌握得多么彻底,也不能阻止人犯意外错误。--玛格丽特教授

 

应急演练可以定期举行。前提是对各种意外情况,提前准备好了预案。预案在演练过程中,可以发现系统问题、检验相关人员SOP/EOP的操作熟练情况。

 

举个例子:支付系统由于下游银行通道能力参差,需要制定关闭XX银行通道的SOP,并进行演练。

 

应急演练一般要求级别较高的人员进行组织,确保其对突发情况有一定的应变权利,同时也能敏锐的发现新问题,确保效果。应急演练我个人总结要分为4个步骤,实际上也是标准的PDCA方法的步骤:

 

1、提前通知,确保参加人员掌握了需要的知识。同时同步到应急演练的目标、相关文档、时间、地点、参加人员

2、演练开始时第一步是告知大家演练的目标、流程和检查项目,比如过程中会检查大家对SOP/EOP的操作熟练情况,如果不熟练则会进行通报。

3、按流程步骤进行演练

4、进行演练总结,制定改进计划

 

在我实际进行过的演练中,上面提到的第二步做的不是很好。可能是作为一项例行事务,演练组织人员习惯于这项工作,认为没有必要重复说明。实际上我认为这是最重要的一步。因为第一,每次演练可能会有一些新人加入,他们不了解背景。第二,大家最后可能只记得演练的一个目标,把优化流程、找问题这些事情忽视了,演练效果大打折扣。

 

SOP/EOP

 

SOP(Standard Operating Procedure三个单词中首字母的大写 )即标准作业程序,就是将某一事件的标准操作步骤和要求以统一的格式描述出来,用来指导和规范日常的工作。

 

EOP(Emergency Operating Procedure三个单词中首字母的大写 )即应急操作流程,用于规范应急操作过程中的流程及操作步骤。确保人员可以迅速启动,确保有序、有效的组织实施各项应对措施。

 

全链路压测

 

全链路压测是一个很好的数据说话的方法,下面要介绍的扩容和降级都要依赖于压测的结果进行。同时,它也是提前发现系统问题的有效手段。

 

挡板压测/联合压测/封版压测

 

挡板压测

挡板压测就是链路上需要与外部交互的地方使用mock模拟来进行压测。比如微信支付,要模拟使用银行卡支付,不能每次压测都先冲几个亿来做测试吧。这时候可以模拟银行侧的返回值进行模拟。这个环节主要用于发现内部问题。

 

联合压测

联合压测就是真的和交互的外部机构沟通好一起压测。如果测试微信支付,还真需要提前冲几个亿来做测试。当然,测试完可以退款。这个环节有个重要职责是验证合作方能力,比如合作方有三个银行,一个银行并发量不够,那大促时就少路由一些请求给它。

 

封版压测

封版压测其实和前面两个压测不在同一维度。封版压测既可以是挡板压测,也可以是联合压测。目的在于测试系统稳定性。

 

重启服务

 

Java服务如果长时间不发布,没有任何bug的情况下也会内存缓慢增长。因为JVM申请了的内存,只要进程不死就不会释放。虽然咱们JVM参数里指定了堆的大小和每个线程占用的大小。但是程序运行过程中还会不可避免的申请很多堆外内存。比如数据库操作就会产生很多堆外内存。我负责的服务就发生过一个服务近1年没有任何发布升级,内存比刚重启后一周增长5%的情况。

 

除了内存,重启还能避免很多慢性问题在一个关键点爆发。所以也热点和秒杀保护的一个重要举措之一。

 

VIRT/RES/SHR

 

这里既然提到了JVM内存,那就顺便说一下怎么观察。常见的是使用top命令。

 

关键列的数据含义如下:

 

VIRT(虚拟内存)

1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;

2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。

3、VIRT = SWAP + RES

 

RES(常驻内存)

1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;

2、包含其他进程的共享;

3、如果申请10MB的内存,实际使用1MB,它只增长1MB,与VIRT相反;

4、关于库占用内存的情况,它只统计加载的库文件所占内存大小。

5、RES = CODE + DATA

 

SHR(共享内存)

1、除了自身进程的共享内存,也包括其他进程的共享内存;

2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;

3、计算某个进程所占的物理内存大小公式:RES – SHR;

4、swap out后,它将会降下来。

 

它们之间的关系用一张图来表示就是

 

 

扩容

 

微博历史上曾发生过许多次服务器崩溃的情况。这种情况大多可以通过提前扩容解决的。但是一直停留在扩容状态经费上有问题:一台服务器每年成本按3万来算,100台就是300W。热点流量带来的收益并没有高。

 

近几年容器技术突飞猛进,对于热点和秒杀等场景,有的公司已经做到了弹性伸缩。就是根据流量情况动态调整服务的集群机器数。公司还可以和云厂商合作,让厂商提供动态扩容能力。

 

对于大公司而言,其实像阿里云、腾讯云这种云服务器的成本要比自己管理服务器成本要高。当然最贵的是亚马逊云,这是题外话。像微博这种临时扩容场景,服务器费用收取是按秒来计费的。

 

微博在【马蓉事件】中,有次马蓉说希望给自己来次专访,微博提前租了阿里云机器。结果没有提供任何实质性证据,也没有什么流量。气的微博团队@马蓉让她结服务器的账。

 

不管怎么说,很多热点事件来临前,提前扩容是可以解决问题的。所以,容器技术的一个重要指标就是创建容器的耗时,有的团队已经做到30s可以创建一个容器。意思是点击申请容器到容器上的业务镜像启动提供服务只需要30s!

 

降级

 

写文章要注意逻辑闭环。回到开头“当年《甄嬛传》热播,调用了我们团队的媒体资讯接口。接口被调用挂了”这个问题。

 

当时最大的问题是媒体资讯核心服务上有获取视频和专辑两个主要接口。视频咨询内容很小。就是下图所示内容简介这些视频的主要信息。

 

 

而专辑如下图所示的花絮呀、正片呀所有的这些主要内容简介打包在一起。我记得当年《甄嬛传》一个专辑包含了几千个视频信息?

 

当时服务器就是因为调用专辑给调挂了。当时正确的做法应该是降级专辑,只返回单个视频信息。当然了,在架构上,这个量级是要拆分服务的,这是题外话。

 

而在热点秒杀来临时,降级一些非核心服务,比如:定时服务、批量程序等。以节省带宽、线程等资源给核心服务。据我了解,一般大公司秒杀之前都要走一套标准的降级流程。

有关热点和秒杀来临前要做的5件事的更多相关文章

  1. 为了开放互联,明道云做了十件事 - 2

    本文来自明道云资深研发经理孙伟,在明道云2022年秋季伙伴大会活动演讲,经校对编辑后整理为演讲精华。一、开放没有选择很多客户选择我们的一个重要原因,是明道云所能提供的产品开放能力。开放其实是没有选择的,坦白来讲,我也不希望开放,我希望客户所有的业务系统都用明道云管理,这样对我们是更有利的。但是,现实中因为企业业务的多样性与复杂性,没有任何一家平台可以做到一站式解决所有问题。为了方便客户,我们就必须开放自己,让客户用得更好。1.一个典型的业务场景需要多少个系统?我们先来看一个典型的业务场景。一个客户从网站上下了一个订单,经销商收到订单之后去向企业订货。企业订货之后如果自身不进行生产,就需要向供应

  2. Javascript 计时器只是分钟和秒 - 2

    我找到了一个JSFiddle有一个每秒计数的计时器。除了我希望它只用分钟和秒来工作。没有时间。有什么想法吗? 最佳答案 DATE_OBJ.getSeconds()获取Date对象的秒数。DATE_OBJ。getMinutes()获取Date对象的分钟数。setInterval每隔一秒(1000ms)调用处理函数。varhandler=function(){vardate=newDate();varsec=date.getSeconds();varmin=date.getMinutes();document.getElementByI

  3. javascript - XMLHttpRequest 和 Chrome 开发者工具说的不是同一件事 - 2

    我正在使用XMLHttpRequest和Rangeheader以5MB的block下载一个约50MB的文件。一切都很好,除了检测我何时下载了最后一个block。这是第一个block的请求和响应的屏幕截图。请注意,Content-Length是1024*1024*5(5MB)。另请注意,服务器正确响应前5MB,并在Content-Rangeheader中正确指定整个文件的大小(在/之后):当我将响应正文复制到文本编辑器(Sublime)中时,我只得到5,242,736个字符,而不是Content-Length指示的预期的5,242,880个字符:为什么缺少144个字符?对于下载的每个bl

  4. javascript - 试图在我的 javascript 代码中理解 "this"(一件事有效,另一件事无效) - 2

    我一直在尝试通过将一本书中的一些Jquery示例重构为javascript来学习javascript。在下面的代码中,我将点击监听器添加到选项卡,并在用户单击选项卡时使其变为事件状态。vartabs=document.querySelectorAll(".tabsaspan");varcontent=document.querySelectorAll("main.contentli");for(vartabNumber=0;tabNumber当我运行它时,它会返回一个未定义的错误。但是,我尝试用this.classList.add("active")替换tabs[tabNumber].

  5. 1月20日,30秒知全网,精选7个热点 - 2

    ///国家发改委:中国是全球能耗强度降低最快的国家之一2012年以来,我国以年均3%的能源消费增速支撑了年均6.6%的经济增长,单位GDP能耗下降26.4%,是全球能耗强度降低最快的国家之一///苹果自研5G芯片或将推迟至2025年后苹果原计划在2023年推出自研芯片,但因为功耗及效能表现不如预期,推出时间将延后到2025年之后,制程将推进采用台积电4nm,届时将搭载于iPhone17系列///飞常准:时隔近3年,国际单日客运航班量首次恢复至300班次以上时隔2年半多,国际及地区航线单日客运航班量首次恢复至300班次以上///国家发改委:我国风电、光伏发电装机均处于世界第一落实可再生能源发电全

  6. javascript - 热点插件 scanWifi() 在 Android ionic cordova 中不起作用 - 2

    我在扫描最近的wifi时遇到问题。我正在使用ionicCordova框架。我使用了Hotspot插件的scanWifi方法来扫描wifi列表。我引用了以下链接:https://ionicframework.com/docs/native/hotspot/我的代码是:import{Hotspot,HotspotNetwork}from'@ionic-native/hotspot';this.hotspot.scanWifi().then((networks:Array)=>{this.availableWifiList=networks;});当应用程序尝试扫描最近的wifi时,它会返回

  7. javascript - 使用 DOMElements 的 THREE.js SphereGeometry Panorama 热点 - 2

    我使用SphereGeometry创建了一个简单的WebGL3D全景应用程序,PerspectiveCamera和一个CanvasTexture.现在,我希望通过在SphereGeometry的某些部分添加“热点”来使场景栩栩如生。.我遇到的问题是了解如何更新各种DOMElements以便他们的位置反射(reflect)更新的Camera位置。基本上,作为Camera旋转各种DOMElements会相对于相机旋转的方向移入和移出视野。我尝试定位absolute到和translatingX和Y使用返回的PerspectiveCamera的位置camera.rotation但它并没有真正起

  8. javascript - 分钟和秒的 jQuery 倒数计时器 - 2

    我想创建一个jquery倒数计时器,我尝试了以下代码但它不起作用。我该怎么办?演示:https://jsfiddle.net/tbosn210/varinterval=setInterval(function(){vartimer2=$("5:01");vartimer=timer2.split(':');//byparsinginteger,Iavoidallextrastringprocessingvarminutes=parseInt(timer[0],10);varseconds=parseInt(timer[1],10);--seconds;minutes=(seconds

  9. javascript - Javascript 中的十进制度到度分和秒 - 2

    我正在尝试编写一个函数,将我的十进制度数(纬度或经度)转换为DMS度分秒。我知道我打算将小数点数乘以60,然后它又是小数点。但我是个菜鸟。我会拆分号码吗?functionConvertDDToDMS(DD){eg.DD=-42.4D=42;M=4*60;S=.M*60;varDMS=returnDMS//appendDirection(N,S,E,W);}我走在正确的轨道上吗? 最佳答案 functionConvertDDToDMS(D,lng){return{dir:D上面给了你一个对象{deg,min,sec,dir},其中se

  10. 如何让手机共享电脑代理网络的WIFI热点 - 2

    参考:手机共享电脑的proxy网络把电脑的网络代理给安卓设备如何将电脑的代理网络以WIFI热点的方式共享电脑端设置代理:打开电脑上的proxy软件并设置其端口号(例如:7890),且允许局域网(例如:AllowLAN),一般都在设置中,自己找下。将proxy软件加入windos防火墙白名单。打开win10自带的移动热点,此时windows的更改适配器选项中会多一个移动热点使用的连接(例如:本地连接*11,不同电脑可能有所不同)。右键上图中的第二个以太网连接(不同电脑可能有所不同),勾选上“允许其他网络用户通过此计算机的Internet连接来连接”,家庭网络连接选择上面提到移动热点的连接(例如:

随机推荐