本文主要是介绍互联网架构的三板斧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
互联网架构的三板斧
Ps:关于[三]的流行参考,百度可得
宅男有三好;Dota、基友、破电脑。萝莉有三好;柔体、轻音、易推倒。
屌丝有三废;在吗、忙不、早点睡。
女神有三宝;干嘛、呵呵、去洗澡。
“ 与传统意义上的红包相比,近两年火起来的互联网“红包”,似乎才是如今春节的一大重头戏。春晚直播期间讨论春晚的微博达到5191万条,网友互动量达到1.15亿,网友抢微博红包的总次数超过8亿次。看得见的数据背后,隐藏的是什么看不见的技术呢?”
按照各家公布的数据,除夕全天微信用户红包总发送量达到10.1亿次,摇一摇互动量达到110亿次,红包峰值发送量为8.1亿次/分钟。而支付宝的红包收发总量达到2.4亿次,参与人数达到6.83亿人次,红包总金额40亿元,峰值为8.83亿次/分钟。春晚直播期间讨论春晚的微博达到5191万条,网友互动量达到1.15亿,网友抢微博红包的总次数超过8亿次。”--以上数据引用自InfoQ[解密微博红包:架构、防刷、监控和资源调度]。 本文会以一些公开的内容聊聊万变不离其中的所谓绝招,为了吸引要求,素材主要参考淘宝大秒系统和各家红包系统的情况。第一板斧第一板斧:活下来 [Stability]俗话说身体是革命的本钱,首先要活着。大凡架构还没有舍身成仁的死法,都是好死不如赖活着。 关于如何活着,其实是有模式可循的,活着这事在技术界也有一个蛮好听的名字--稳定性(花名 Stability)。稳定性实践笔者印象比较深的有2篇内容,一是由淘宝小邪在2011年分享的[淘宝稳定性实践]。
一片信手普及的基础文也写得这么干,江湖也不禁为自己点赞了。(话说龙姑娘的红包,啥时候发一下…)
http://www.slideshare.net/jboner/scalability-availability-stability-patterns
由于营销活动(创造营销节点、扩大影响力的需要),总有很多产品策划、运营乐此不疲的玩着一个game---在足够集中的时间内比如秒级处理足够多的用户请求,让世界为此狂欢,同时也是彰显技术实力的一次大考。
小米卖着抢号的手机、天猫发明了双11光棍节、微信和支付宝连续2年做着新春红包。营销活动的时候要使用前2板斧,保证可用性和简单可扩展性,同时还要祭出第三板绝杀—拦河大坝、缓存为王、去热点资源的并发。
使用缓存,能越前端缓存的放在前端,
这样调用链路最短。
这里的缓存不仅仅是redis、或者memcached,而是local或者climatchent优先的思路,去除对并发资源的依赖。比如[ 揭秘微信摇一摇背后的技术细节]一文中提到:按一般的系统实现,用户看到的红包在系统中是数据库中的数据记录,抢红包就是找出可用的红包记录,将该记录标识为match属于某个用户。在这种实现里,数据库是系统的瓶颈和主要成本开销。我们在这一过程完全不使用数据库,可以达到几个数量级的性能提升,同时可靠性有了更好的保障。 1 支付系统将所有需要下发的红包生成红包票据文件;2 将红包票据文件拆分后放到每一个接入服务实例中;3 接收到客户端发起摇一摇请求后,接入服务里的摇一摇逻辑拿出一个红包票据,在本地生成一个跟用户绑定的加密票据,下发给客户端;4 客户端拿加密票据到后台拆红包,match后台的红包简化服务通过本地计算即可验证红包,完成抢红包过程。
分拆热点
上文提到,在极端情况下大秒使用了二级缓存,通过拆分key来达到避免超过cache server请求能力的问题。在facebook有一招,就是通过多个key_index(key:xxx#N) ,来获取热点key的数据,其实质也是把key分散。对于非高一致性要求的高并发读还是蛮有效的。 如图 则解决之道是: • Hot keys are published to all web-servers • Each web-server picks an alias for gets – get key:xxx => get key:xxx#N • Each web-server deletes all aliases微博团队披露:服务端本地缓存,使用nginx本身缓存和服务器的L0缓存,来提升模块的响应速度,做到了90%以上核心接口的响应时间在50ms以内,减少了进程等待时间,提升了服务器的处理速度。
解决并发有1种基本办法: 分拆!而分拆有两种拆法,1拆资源一是把资源(resource)拆了,著名的比如ConcurrentHashMap,拆成了16个桶,并发能力大大提高。2拆基础数据在红包应用中,如果还依赖一个共同的基础数据,也可以把这个基础数据拆成多个cell。预处理[ 互动1808亿次,16倍的超越!谈支付宝红包的高并发挑战]一文中如此说:“在这次春晚活动中,涉及到大量的资源,包括图片、拜年视频等。图片和视频都比较大,十几b到几百kb不等。当在高峰期时,如果瞬间有海量的请求到CDN上,这么大的请求带宽根本扛不住。我们当时预估了大约有几T的带宽需求。 为了能有效地扛住瞬间峰值对CDN的压力,我们对资源进行了有效的管理和控制。首先在客户端预埋了几个缺省资源,万一真不行了,这几个资源可以用。其次尽量提前打开入口,当用户浏览过后,就将资源下载到本地。再次浏览时不再需要远程访问CDN。最后,做了应急预案,高峰期一旦发现流量告警,紧急从视频切换到图片,降低带宽压力,确保不出现带宽不够而发生限流导致的黑屏等体验不好的问题。最后的结果可以用完美来形容,由于预热充分,带宽虽然很高,但没达到我们的告警值,应急预案也没有使用。
”
微信团队也提到:
“
在除夕,用户通过摇一摇参与活动,可以摇到红包或其他活动页,这些页面需要用到很多图片、视频或 H5 页面等资源。在活动期间,参与用户多,对资源的请求量很大,如果都通过实时在线访问,服务器的网络带宽会面临巨大压力,基本无法支撑;另外,资源的尺寸比较大,下载到手机需要较长时间,用户体验也会很差。因此,我们采用预先下载的方式,在活动开始前几天把资源推送给客户端,客户端在需要使用时直接从本地加载。
”
异步化 江湖传说中有一句话,叫能异步的尽量异步。做活动的时候,资源多宝贵啊,对C端无感但可以容忍的,就让它慢慢做,而此种一般放入到队列当中。杭州的蘑菇街七公又名小白,是一个热情的朋友。他提及交易服务依赖过多的解决之道。服务依赖过多,会带来管理复杂性增加和稳定性风险增大的问题。试想如果我们强依赖10个服务,9个都执行成功了,最后一个执行失败了,那么是不是前面9个都要回滚掉?这个成本还是非常高的。所以在拆分大的流程为多个小的本地事务的前提下,对于非实时、非强一致性的关联业务写入,在本地事务执行成功后,我们选择发消息通知、关联事务异步化执行的方案。(看看下图,那些可以异步化?)
拦、拦、拦;之后缓存抗;缓存扛不住的并发分拆;但是还有一个问题,就是极端热点资源在db里,如果并发高还是会出问题。大秒一文中有较好的处理方案,就是排队。Web服务器排队,在db层还做了一个patch排队,真心是业务是最好的老师,不得已何必祭大招!
应用层做排队。按照商品维度设置队列顺序执行,这样能减少同一台机器对数据库同一行记录操作的并发度,同时也能控制单个商品占用数据库连接的数量,防止热点商品占用太多数据库连接。关于详情,可以阅读大秒一文。
-
活下来(Stability)
-
简单可扩展(Scalability)
-
拦河大坝/去并发
在第三板斧中又有分层拦截、多级缓存、数据近端、分拆锁、预处理、异步化及队列等pattern。学习原则:灵活运用,不尽信经验。
写这么个长篇,我也是醉醉的了,权当为那些没时间学习、没仔细学习的朋友尽心了。
原文地址:http://mp.weixin.qq.com/s?__biz=MzI3MzEzMDI1OQ==&mid=2651814363&idx=1&sn=187b38d35456f89a1030b24f8c4388c3&scene=23&srcid=0424R2Pm5qshQXpvTOz5hAXF#rd
这篇关于互联网架构的三板斧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!