【另类见解】秒杀并非高不可攀

一提到秒杀很简单这个话题,我知道要被别人鄙视了:你不懂高并发... 这年头开头不画个思维导图都觉得掉价

image

谈到秒杀,网络上不少于几千片文章,但是大多大同小异。如果你的微信当中关注了几个编程技术类的公众号,我敢说,每个公众号几乎都发过秒杀的文章

秒杀这种场景在流量这个维度很有独特性,大起大落的流量冲击对系统是个考验。为什么这么说呢?大的流量或者说高并发请求,考验的不仅仅是数据库的最大承受压力,而且对于带宽也有很大的考验,入口流量之后就是对整个系统的承受能力的考验。

其实我觉得这里大多数人有一个误解:秒杀对整个系统的考验,最终会落到数据库上。正是这个误解,导致了大多数人会对DB优化花费很大的精力。

现实的世界存在矛盾,只要找到矛盾就能解决问题,对应到编程也一样。

秒杀之所以被神化,是因为流量大,但是很多系统最后崩塌的却是数据库,很少有团队因为应用系统崩溃而导致秒杀失败。因为对于整个系统来说,数据库是数据最后的持久化,是存在状态的,而应用系统一般都是无状态的,都是可以横向扩展的。

其实说到底,流量还是要削峰或者分流,我想如果把流量削到数据库的可承受范围之内,秒杀可能和其他业务场景无异。

过多的中间件

说出来你们肯定见过,网络一大堆秒杀的解决方案,又是XXMQ,又是XX缓存,又是XX负载均衡,又是XX中间件。虽然架构图很完美,但是落地呢?

落地是有难度的,而且还有很大风险。难道各种中间件不用维护吗?中间件不会出故障吗?每个中间件不用做高可用吗?这么多中间件搭配起来,运维成本是很高的,最主要的是出问题排查问题的成本会很高。

我们需要的是架构师,不是框架师。把复杂问题用简单的解决方案解决,才不会给自己挖坑,我一直是这么认为。

那中间件需要吗?肯定是需要的,那么多成熟的东西真的能解决你很多问题,但是前提是正确的用。比如Redis,做缓存用途很正确,但是你把它当做高速数据库我就不认同了,虽然它可以持久化,但是大并发的情况下,Redis做数据库是不合适的。

吃掉所有流量

秒杀业务具体能到多大流量谁也不能确定,虽然可以根据以往经验预估,但是往往还是会超出想象。要想把这些流量全部流入服务器进行处理,需要付出很多资源。最坏的情况是,把流量全部吃掉之后,还要吐出90%,这就让人恼火了。

所以,能不能只吃能够吃饱的流量呢?比如说:库存有1000件商品,如果我们只放进来1000个请求(虽然很牵强),那整个系统是不是很容易构建。就像吃饭一样:本来一碗米饭就能吃饱,非要吃下10碗,然后吐出9碗吗?

SO,是不是只要在系统边缘加一个限流就ok了?值得思考

image

客户端UI

无论业务怎么样,客户端用户体验总要给人一种还有希望的感觉

image

其实秒杀这种场景是最能发挥忽悠人才能的了,你前面有多少人排队,天王老子也别想知道。就算真的要给用户反馈前面还有多少人,其实完全可以返回一个不太离谱的随机数,反正用户又不会电话投诉。

多说一句,甚至把限流算法放到客户端都行,反正不懂行的又看不懂代码,这种骚操作我确实见过。

如果非要返回真实的排队人数的话,可以引入一个线程安全的中心化队列即可,比如用神器Redis,每成功穿过限流窗口一个请求,就把对应的UserId插入这个队列,这个队列理论上不会太大,因为有程序一直在消费。

image

静态资源

所谓的静态资源就是指那些不会变动或者很少变动的资源,比如商品的图片就属于这种。在秒杀这种场景下,静态资源的访问一定要分离出业务服务器,最好的解决方案是利用CDN来加速

CDN是个好东西,谁用谁知道。不但可以降低自己服务器的压力,而且还可以给全国各地的用户请求加速,具体原理咱们之后有机会可以唠唠。如果技术允许的情况下,甚至一些边缘计算的能力都可以放置在CDN。

写在最后

如果不是阿里,腾讯这种量级的公司,一般中小公司搞秒杀活动并不是想象中那么恐怖。大家可以放平心态。做技术一定不要乱了阵脚,技术的选择固然重要,但是更重要的是有全局掌控的能力,哪个环节最容易出问题,要做好全面监控,出了问题第一时间能解决问题才是后期最重要的。

END

原创

一个搜索需求搞垮微服务

原创

微服务并不能解决你的烂代码问题

分享收藏点赞在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我又相信爱情了!

1 圣诞限定款的肥宅快乐水更好喝了吗?不!更贵了2 周边鬼才!这手机壳我爱了3 你以为是个王者,其实是个大脸......4 高温超导材料达到临界温度后能使物体悬浮在不同位置5 火山爆发你见过吗?6 我又相信爱情了!…

opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组

题目描述:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1]。其中B中的元素B[i]A[0] * A[1]... * A[i-1] * A[i1]... * A[n-1]。不能使用除法。解题思路:首先,仔细理解题意,B[i]是A数组所有元素的乘积,但是没…

python引用numpy出错_使用numpy时出错

我尝试使用pandas python进行excel操作。在每当我尝试使用pandas库时,它都会给我错误的提示:numpy没有安装。在现在,当我尝试安装pip install numpy和pip安装pandas时,它说需求已经满足了。在但是当我尝试做一个简单的numpy教程时…

中国移动:面向全业务运营的安全管理平台

在2008年的一个电信运营支撑系统论坛上,来自中国移动的集团网络部的安全副处长周智先生做了一个题为《面向全业务运营的安全运行管理系统定位及建设思路》的报告。 在这个报告中,周处首先分析了全业务运营环境下的安全挑战,然后提出了在全业务…

记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析

一:背景 1. 讲故事说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我。无数次的听说用 Unity 可做游戏开发,但百闻不如一见。游戏中有很多金庸武侠小说才有的名字,太赏心悦目了。000000df315…

成年人的数学公式

1 成年人的数学公式2 唯一对我说过“别走好吗”的人3 主人发起疯来有多可怕4 别人家的狗看到主人有危险▼你家的……▼5 蜘蛛捕食瞬间6 蜡烛重燃(冒的白烟是固态小颗粒的石蜡蒸汽,可燃)你点的每个赞,我都认真当成了喜欢

ubuntu运行python ide_在Ubuntu-16.04中安装Python可视化IDE——Spyder

Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境。和其他的Python开发环境相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值。Spyder的界面由许多窗格构成,用户可以根据自己的喜好调整它们的…

Linux查看系统信息的一些命令及查看已安装软件包的命令(转)

系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所…

日历签到 java_我的Android案例―签到日历

public class MainActivity extends Activity {//Log标签private static final String TAG "SIGN";//声明对象private Button sign;private TextView show;private GridView myDate;//获得本地时间Time nowTime new Time();//1个月内的天数private int dayMaxNum;p…

phpMailer 配置 企业邮局 163

phpMailer的两种配置,记录一下,差别在一个要写完整邮件地址,一个只要填前面的部分。一、自己的企业邮局发信$mail new PHPMailer();//$body file_get_contents("mail/".$date.".html"); //$bo…

Linux运维实战之DNS的高级配置(转发器、视图等)

上次博文我们具体配置了一台DNS服务器并实现了主辅之间的区域传送,本次博文我们来看看DNS的一些高级配置。 在进行DNS的高级配置之前,必须要理解DNS的原理(参见http://sweetpotato.blog.51cto.com/533893/1596973) 并且对DNS的基础…

POJ1269 Intersecting Lines 计算几何 C语言

题目:http://poj.org/problem?id1269 题目大意:给出四个点确定两条直线。如果是一条线输出“LINE”,如果平行输出“NONE”, 如果有交点输出交点坐标。 思路:注意是直线,不是线段啊。 用两点式推出两条直线…

史上最烧脑的学习方法,看完瞬间涨姿势!

▲ 点击查看 在美国,有一个天才儿童计划,选拔一批“天才”儿童进入天才班。这个计划是为了保证每个人接受平等教育机会的同时,也为精英成长提供合适的土壤。美国所谓的天才和精英是怎样的标准呢?进入天才班的儿童首先要通过一个叫…

WPF轮播图实现方式(二)

WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看,谢谢~。 01—效果预览02—代码如下一、EmphasizerCarousel.cs 代码如下using System; using System.Collections.Generic; using System.Collections.Obj…

java开闭原则_什么是开闭原则?如何实现开闭原则

2015-04-13 06:30:01阅读( 137 )开闭原则的解释就是:软件实体应当对扩展开放,对修改关闭,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的…

实现链栈的各种基本运算的算法_LeetCode基础算法题第78篇:如何不用加减号实现两数的加法运算?...

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对…

QQREADERB9B632B5D3670680

QQREADERB9B632B5D3670680

ListBox类似组件,鼠标右键点击事件得到选中Item

允许多选的ListBox需要加判断.可以参考被注释掉的代码.不再赘述. 1 //OnMouseUp: 2 3 var 4 APoint: TPoint; 5 Index: Integer; 6 begin 7 if ButtonmbRight then 8 begin 9 APoint.x : X;10 APoint.y : Y;11 Index : ListBox.ItemAtPos(APoint, True);1…

Bootstrap在线编辑器简单分享

Bootstrap 已经使响应式网站开发变得简单很多。 但是如果你不必手动写全部代码,事情会如何呢? 如果你可以自由地选择你想要使用的Bootstrap 组件、并可以把它们拖拽到画布中,事情会如何呢?这就是Bootstrap 编辑器的用武之地。 在这…

twitter mysql_twitter-mysql改进点

目前最新的twitter-mysql版本基于mysql5.5.22,以下总结了一些比较明显的改进点,大部分已经亲自证实,其他一些诸如修复的比较次要的问题(例如编译问题)这里暂不列出,可以详细参阅https://github.com/twitter/mysql/wiki/Change-His…