电商项目怎样处理或用啥技术解决高负载、高并发、高可用性问题( 六 )


至于具体到单机层面,技术跟以前没有太大的差别,主流reactor模型,上层你想做成事件模型(redis)还是多线程(主要java框架,比如netty)看你自己的取舍了。

缩减流量 缩减流量的时候有个装逼的名字叫做柔性可用,怎么说了,在当前的资源(也可能有资源但是时间不够)下,系统吞吐量怎么做都达不到峰值的实际流量,那么怎么办呢?对流量下刀,让流量减少。主要有几个手段:降级/限流/预加载
降级就是说在高峰期间把一些非核心流程的服务降级甚至屏蔽,减少系统的流量以及压力。比如电商商品详情页的评论,这个时候就可以考虑干掉,大家的重心都在抢商品了,屏蔽掉最高峰几分钟就好。
限流就是说我先预估好我这个服务能够承受多少流量,比如说A请求我可以承1000qps,那好,我就设定这个线,超过这个量的,不好意思,哥承受不了,慢慢等。京东,阿里双时候也有一些错误页面就是这里设置的。当然这里有一个要注意的是避免用户重复刷新。
预加载就是说我先把你需要的一些数据在低峰的时候给你,避免等到高峰期大家一窝蜂都问我要,当你微信红包春晚那一晚就做了这些事情

熔断
好了,上面说的都是怎么做到让系统吞吐量 \u0026gt; 实际流量。 那么事情往往不能如愿,流量就是\u0026gt;系统吞吐量了怎么办呢?这时候首要做的事情就是熔断了。
熔断就是说我在发现下游系统服务异常的时候,我先不往下请求了,避免大家都玩完。
其实就是一种避免情况变得更坏的措施了,和前面的降级有些像,不过降级我们可以更有选择的,主动去做,要熔断的时候都是情况已经很糟糕了,做这个就是避免变得更糟糕。

运维系统
对于一个大型的系统,你服务的异常能否及时发现,能否自动化恢复/扩容,这些对于你服务的质量都是非常重要的。大型系统最怕的是雪崩,如果能尽早发现问题,雪崩发生的可能性就能大大的降低;同时,在异常发生时,还需要人工一步步去操作,出事的可能性又要增加很多,所以在事前做好事故预防,事情发生的时候能够简化技术人员的操作是有必要的,最好能够完全的自动化。只有做好了这些事情,那么我们的系统才能更小的几率发生故障,更快的恢复起来。


容灾把上面的都搞完了,这时候你觉得已经高枕无忧了,再也不用过担惊受怕的日子了。然后某一天晚上,手机上一堆告警,然后大家一同折腾发现:ca,某电缆被挖断了。
好吧,你说,这怪不了我了,难不成我还把所有电缆守着不成。可是业务不干啊,你不说你sla 四个9么?现在我们有多久没有用户下单了,损失了多少GMV………
这个时候你才发现。原来电缆挖断了也归我管,这就是容灾了。

容灾做起来可大可小,像上面的挖断光纤也要支持容灾的话,那基本就是四个9以上的可用级别了,目前真正做到这些的也就那几家大户,为啥,要钱啊。两地三中心,总得找三个机房吧,机房之间数据的同步,总不能全部走互联网吧,光纤是要几根的吧。
当然除了这种异地灾备,同一机房内的灾备也是有必要的,比如某个机架坏了,某块磁盘坏了,某家供应商系统挂了,怎么办。
这一块做的也不是很多(好吧,我认怂),目前手上做过的事情主要是两个方向: 隔离,冗余\u0026amp;热切
隔离:
比如说机房的机器布置,不要某一类的服务都部署到同一个机架上面,那么好了,如果这个机架坏了,这个服务就完全不可用力。所以同一类服务要切割到不同机架\u0026amp;线路上面去。其他的像供应商如果出现故障也是,比如你接入多家支付厂商,总不能第一家坏了我其他的也不可用,就是这个意思。
冗余:
其实上面已经说了,就是说不要把所有的鸡蛋放到一个篮子里面,多留几分。假如每个部分的可用率是99%,那么几个部分同时失败的概率就低很多了。


推荐阅读