双 11 如何借助 Redis 实现秒杀系统

Posted Python运维圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双 11 如何借助 Redis 实现秒杀系统相关的知识,希望对你有一定的参考价值。

2018年“双11”达到顶峰,一场现象级商业再度创造了新奇迹。11月12日零点,“双11”一锤定音,显示天猫“双11”成交额的大屏幕,数字最终定格在了2135亿元,相较于去年1682亿增长了近27%。

这场被阿里视为商业奥林匹克的“双11”,每一个数字节点均见证了这场商业盛典。从11月11日凌晨开始,100亿元、362亿元、571亿元、912亿元、1000亿元、1111亿元、1207亿元、1500亿元、1682亿元、2000亿元直到2135亿元,11个成交额的节点将2018年“双11”串联成线。

“因为相信,所以看见”这句Slogan在直播现场随处可见,如今则成为佐证“双11”成交量的语言。正如阿里巴巴首席执行官张勇所言,电子商务会改变整个商业,商业会被重新定义,消费者的生活会被重新定义。

与此同时,“双11”驱动着物流行业发生着翻天覆地的变化,1天10亿快递量在“双11”第十年成为现实。11月11日23小时18分钟09秒,2018年天猫“双11”物流订单超10亿。1天10亿包裹,成为十年天猫“双11”最具代表性的里程碑之一。

实时滚动的数据大屏背后早已不是单纯电商业务比拼,“双11”以电商为中心席卷了科技、制造、零售、金融、物流等多领域。曾经仅在线上狂欢的“双11”已经深入到线下延展至供应端,并调动着千万个品牌商、商超、百货购物中心、物流、金融企业一同联动。

2018年天猫双11全球狂欢节,根据现场实时数据,双11开场2分05秒破百亿,26分03秒破500亿,1小时47分26秒破千亿。

根据公开数据,在2017年双11购物狂欢节上,开场28秒钟成交额破10亿, 3分01秒成交额破百亿,9小时04秒破千亿。交易峰值32.5万/秒,支付峰值25.6万/秒,刷新全球纪录。同时诞生的还有数据库处理峰值,4200万次/秒。

几乎毫无悬念,今年天猫双11将刷新去年1682亿的销售记录,技术的各种峰值数据也将再次打破全球记录。

然而在这样的业务场景下,背后是靠什么样的技术来支持如此庞大的秒杀场景?

双11刚过去不久,可能有些童鞋的快递都还木有收到,今天我们一起来探讨下秒杀背后的技术实现。

秒杀系统的架构设计

秒杀系统,是典型的短时大量突发访问类问题。对这类问题,有三种优化性能的思路: 

  • 写入内存而不是写入硬盘 

  • 异步处理而不是同步处理 

  • 分布式处理 

用上这三招,不论秒杀时负载多大,都能轻松应对。更好的是,Redis能够满足上述三点。因此,用Redis就能轻松实现秒杀系统。 

用我这个方案,无论是电商平台特价秒杀,12306火车票秒杀,都不是事

下面介绍一下为什么上述三种性能优化思路能够解决秒杀系统的性能问题:

写入内存而不是写入硬盘 

传统硬盘的读写性能是相当差的。SSD硬盘比传统硬盘快100倍。而内存又比SSD硬盘快10倍以上。因此,写入内存而不是写入硬盘,就能使系统的能力提升上千倍。也就是说,原来你的秒杀系统可能需要1000台服务器支撑,现在1台服务器就可以扛住了。 

你可能会有这样的疑问:写入内存而不是持久化,那么如果此时计算机宕机了,那么写入的数据不就全部丢失了吗?如果你就这么倒霉碰到服务器宕机,那你就没秒到了,有什么大不了? 

最后,后面真正处理秒杀订单时,我们会把信息持久化到硬盘中。因此不会丢失关键数据。 

Redis是一个缓存系统,数据写入内存后就返回给客户端了,能够支持这个特性。

异步处理而不是同步处理 

像秒杀这样短时大并发的系统,在性能负载上有一个明显的波峰和长期的波谷。为了应对相当短时间的大并发而准备大量服务器来应对,在经济上是相当不合算的。 

因此,对付秒杀类需求,就应该化同步为异步。用户请求写入内存后立刻返回。后台启动多个线程从内存池中异步读取数据,进行处理。如用户请求可能是1秒钟内进入的,系统实际处理完成可能花30分钟。那么一台服务器在异步情况下其处理能力大于同步情况下1800多倍! 

异步处理,通常用MQ(消息队列)来实现。Redis可以看作是一个高性能的MQ。因为它的数据读写都发生在内存中。

分布式处理 

好吧。也许你的客户很多,秒杀系统即使用了上面两招,还是捉襟见肘。没关系,我们还有大招:分布式处理。如果一台服务器撑不住秒杀系统,那么就多用几台服务器。10台不行,就上100台。分布式处理,就是把海量用户的请求分散到多个服务器上。一般使用hash实现均匀分布。 

这类系统在大数据云计算时代的今天已经有很多了。无非是用Paxos算法和Hash Ring实现的。 

Redis Cluster正是这样一个分布式的产品。

使用Redis实现描述系统

Redis和Redis Cluster(分布式版本),是一个分布式缓存系统。其支持多种数据结构,也支持MQ。Redis在性能上做了大量优化。因此使用Redis或者Redis Cluster就可以轻松实现一个强大的秒杀系统。 

基本上,你用Redis的这些命令就可以了。 

RPUSH key value 

插入秒杀请求

当插入的秒杀请求数达到上限时,停止所有后续插入。 

后台启动多个工作线程,使用 

LPOP key 

读取秒杀成功者的用户id,进行后续处理。 

或者使用LRANGE key start end命令读取秒杀成功者的用户id,进行后续处理。 

每完成一条秒杀记录的处理,就执行INCR key_num。一旦所有库存处理完毕,就结束该商品的本次秒杀,关闭工作线程,也不再接收秒杀请求。

要是还撑不住,该怎么办

也许你会说,我们的客户很多。即使部署了Redis Cluster,仍然撑不住。那该怎么办呢? 

记得某个伟人曾经说过:办法总比困难多!

下面,我们具体分析下,还有哪些情况会压垮我们架构在Redis(Cluster)上的秒杀系统。

脚本攻击

如现在有很多抢火车票的软件。它们会自动发起http请求。一个客户端一秒会发起很多次请求。如果有很多用户使用了这样的软件,就可能会直接把我们的交换机给压垮了。

这个问题其实属于网络问题的范畴,和我们的秒杀系统不在一个层面上。因此不应该由我们来解决。很多交换机都有防止一个源IP发起过多请求的功能。开源软件也有不少能实现这点。如linux上的TC可以控制。流行的Web服务器nginx(它也可以看做是一个七层软交换机)也可以通过配置做到这一点。一个IP,一秒钟我就允许你访问我2次,其他软件包直接给你丢了,你还能压垮我吗?

交换机撑不住了

可能你们的客户并发访问量实在太大了,交换机都撑不住了。 

这也有办法。我们可以用多个交换机为我们的秒杀系统服务。 

原理就是DNS可以对一个域名返回多个IP,并且对不同的源IP,同一个域名返回不同的IP。如网通用户访问,就返回一个网通机房的IP;电信用户访问,就返回一个电信机房的IP。也就是用CDN了! 

我们可以部署多台交换机为不同的用户服务。 用户通过这些交换机访问后面数据中心的Redis Cluster进行秒杀作业。

小结

有了Redis Cluster的帮助,做个支持海量用户的秒杀系统其实So Easy! 

阿里背后真正支持双11的技术一览:

1. 云计算

利用云计算弹性能力,支撑交易峰值每秒32.5万笔、支付峰值每秒25.6万笔的混合云弹性架构。

2. 分布式消息引擎

在双11当天实现万亿级消息流转。

3. Docker技术

交易核心应用容器化撑起双11交易下单峰值,解放资源的超大规模Docker化技术。

4. 在线交易的数据实时和离线计算能力

支撑全球最大规模在线交易的数据实时和离线计算能力,包括承载阿里巴巴集团核心大数据的离线计算平台,以及双十一保证每秒处理亿条日志的计算。

5. 阿里人工智能

在搜索、推荐以及客服场景下的创新应用,包括人工智能赋能的数千家品牌商家店铺的个性化运营和粉丝会员的精准营销。

6. VR技术

虚拟购物环境背后的VR技术。

7. 前端技术

应对前端极限挑战的淘宝直播首屏秒开,以及应用世界级开源跨平台移动开发工具Weex实现双11会场几近全覆盖,实现全网首屏渲染完美践行“秒开”体验。

8. 监控技术

千万量级监控项,PB级监控数据,亿级报警通知背后的技术。

9. 物流技术

菜鸟通过包裹预测、供应链入库、订单下沉、订单路由调度、电子面单及智能分单,以及末端小件员,涉及十亿级包裹的双11之战。

总之,双11将涉及:基础设施、存储、中间件、云计算、业务架构、大数据、认知计算与人工智能、交互技术等技术领域。

由于篇幅有限无法完全详细展开,我就以其中一个大家最关心的双11秒杀场景为例,贯穿这些部分技术的应用和设计思路。

干货分享


























更多你感兴趣的技术干货,请猛戳下面的阅读原文↓↓↓

以上是关于双 11 如何借助 Redis 实现秒杀系统的主要内容,如果未能解决你的问题,请参考以下文章

秒杀系统实战| 缓存与数据库双写问题的争议

解密 Redis 助力双 11 背后电商秒杀系统

秒杀系统秒杀系统之「防止超卖」一

高并发Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!

双11的秒杀系统,是如何设计的?

阿里P8架构师谈:双11秒杀系统如何设计?