秒杀系统难做 , 是因为库存有限 , 很多人会在集中的时间内读写有限的数据 , 在短时间内 , 系统会面临成千上万倍的流量进入 。那么如何能做好秒杀系统呢?我认为核心思想有这么两点:
将请求尽量的在上游环节就拦截住(不要轻易到数据库这一级)
充分利用缓存
那么这两点如何实现呢 , 下面详细说说:
最上层是客户端层 , 常见的都是浏览器访问 。点击一次【秒杀按钮】 , 然后再点一次【秒杀按钮】 , 那么是访问了两次后端系统么?如果用户手速快一些的话 , 或者用第三方插件不停的点击 , 那么岂不是多出来很多请求 。从产品层面 , 我们会设置点击一次按钮后 , 将按钮置灰 , 从技术角度 , 我们可以通过JS控制几秒内只能提交一次请求 。看 , 这就是“将请求尽量的在上游环节就拦截住” 。
当然客户端层做限制 , 对于在座的程序猿们都是小意思 , 因为一抓包 , 请求长什么样子一清二楚 , 然后写个脚本 , 循环调用就好了;为了防止这样的情况发生 , 后端的服务需要做去重的工作 。比如按照用户名去重 , 在N秒内 , 只允许1个请求访问进来 , 然后做页面缓存;比如10秒内发送了一万次请求 , 其中1次请求访问成功并返回了页面 , 将这个页面进行缓存 , 剩余9999次请求直接返回这个缓存页面 。
再往下走 , 10秒内一个客户只有一次请求进来 , 但是如果同时有一百万个客户 , 那么这10秒内也有有一百万次访问 , 那么如何应对呢?用【消息队列】 , 所有的请求过来 , 都排队吧 , 每次只让有限的请求去访问数据 。
【“秒杀”是如何实现的?】当然访问数据也不是直接去读写数据库 , 这里还有一层数据缓存 , 比如可以使用Memcached或者Redis缓存库存剩余 , 通常在秒杀系统中 , 这个“库存”可以是粗粒度的 , 也就是说这个数字可以是不准确的 , 客户关心的是买到还是买不到 , 而不会关心剩余数量到底是20件还是10件;数据读操作也可以放在缓存中 , 再由缓存和数据库做数据同步 。
上面几步已经拦截了大多数的请求 , 到DB这一层的时候 , 基本上没有什么压力了 。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解 , 希望能得到你的关注 。
以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!
「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助:- 频频融资“输血”,电视剧制作龙头华策影视会迎来“春天”吗?
- 农村俗语:“重阳晴,一冬冷;重阳阴,一冬温”,有道理吗?
- 陈寅恪为何会写出“一生负气成今日,四海无人对夕阳”?
- 井字里加一点是什么字?
- 李易峰和杨幂是你们曾经期待在一起的“cp”吗?
- 什么是海关编码?
- 零钱连续10天超过5000,零钱连续十天超过五千元
- 如今,银行的未来该如何发展?
- 法国人如何看待本国历史上无产阶级的政权“巴黎公社”?
- “一屋不扫,何以扫天下”,扫屋和扫天下有没有根本性联系?