https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ

在京东我们是如何做服务降级的

https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ

当我们依赖的中间件资源或者是上游服务性能出现严重问题时,为了防止用户看到错误页面或者加载页面时间过长,我们需要将服务降级静态页面。或者将不影响主流程的旁路服务关闭掉,以让出资源给主要流程。这类操作称为降级。服务降级方案有三种方式,降低一致性、减少非必要功能、简化功能,后面我会分别举例说明。

想要做好降级的前提是,提前压测得出指标上限,还有提前梳理好系统的性能制约点,比如依赖的服务响应超时时间和基础负载性能(比如CPU使用率),并纳入监控范围。当前提就绪后,我们就开始编写异常降级操作手册,包括托底预案,描述好当发生什么样的场景时,每一步做什么,它的预期结果是什么,还有是否演练过,只有经过真枪实弹考验的士兵才是好士兵。最后一点,我们会特别注意的,降级方案是手动生效还是自动生效的,它和止损息息相关。
先来看看手动生效。手动生效意味需要当有人反馈或者监控发现有异常后,手动修改配置中心的值,使得提前准备的降级预案生效。比如正常情况下我们会先读缓存,如果缓存中没有就尝试从数据库读取,服务降级后,当缓存无法命中时,直接返回默认值,简化功能。不过需要注意,有些情况操作生效时间不是实时的,客户端会缓存第一次加载的配置,然后每隔一段时间就同步一次,甚至需要重启APP才能生效,必要性只能让客服引导用户重启APP。
再来看看自动生效。一般做法是,在接口定义时,定义标明好失败或者超时返回的响应码和数据。有时我们会返回托底跳转链接给前端,让前端重定向加载托底页面。或者平时让前端一次性分别请求正常的链接和托底的链接,当正常的请求响应异常时就展示托底的数据,这种方案虽然每次都是经常两次,但是托底方案一般是轻量级的,所以也不失为一种策略。
那服务降级或者托底方案应该怎么做呢?
如果是核心流程,比如下单或者支付类不可或缺的流程,降级预案一般是在负载均衡Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队。如果是非核心流程,比如领卷中心交互型的,可以设置用户点击必弹“已抢完”提示,总比功能缺陷直接暴露给用户好。非核心流程中的不那么重要的服务,我们会直接关闭掉,比如红点提醒、猜你喜欢。还有一种比较特殊,它和用户日常操作强关联的,比如该服务平时展示的列表都是用户主动关注的,比如关注的达人最近发布的好文。那我们就每天同步存储一份有界的无状态的列表,当出现异常时就展示昨天的,这是在降低数据的一致性。这里我强调的是无状态的,因为我们需要避免展示过期的数据,不然显得很唐突和怪异。比如发现的京品推荐官,降级时会显示回放列表。
最后再来看看几个注意事项。
第一:周知。一个主入口里面会有很多的Tab,当默认Tab的服务短时间无法恢复时,往往会改变全部用户的或者部分用户的默认Tab,此时会和业务方提前沟通好,确保能承载相应的流量,防止雪崩效应。另外一个就是当发生异常时,及时和领导报备,不要一个人埋头苦干,其他人或许会有更佳的止损方案。
第二:事务补偿。当然每个业务的预案千差万别,有些还得准备好补偿机制。比如京东优惠小程序中组团领京豆,当成团而没有给用户京豆余额增加时,需要能及时手动补发。
第三:入口隐藏。有些情况,我们会隐藏入口或者入口明确提示用户该功能升级维护中,避免出现用户点击了以为生效了,但是实际上是不会生效的情况,造成用户损失。比如之前京东的东东农场中定时领取水滴,业务调整了但是入口没有做调整,导致了大量的客户投诉。
第四:降级来源和正常数据来源分开。
第五:紧急扩容。当服务负载过高,我们可能临时申请容器抗压。在京东,在大促高流量节点期间,上线变更需要多级审批。突发情况下我们为了减少上线流程时间,会在预发布分组发布线上配置的服务,因为预发布分组是无须领导审批的。

服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队的更多相关文章

  1. Nginx 中利用 Lua 脚本做访问控制

    使用场景 需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件. 实验环境 Ubuntu 14.04 Nginx 1.4.6 安装 Lua 运行环境 sudo apt-get install ...

  2. openresty(nginx)中使用lua脚本获取请求IP地址的代码

    人狠话不多,直接上代码:------------------------------------------------------------------------------------- lo ...

  3. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  4. 在redis中使用lua脚本

    在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...

  5. Nginx 内嵌lua脚本,结合Redis使用

    0x00 Nginx 内嵌Lua脚本有下面特点: 20k个并发连接 Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能 Lua速度极快(寄存器指令) 0x01 应用场景 在w ...

  6. C++中嵌入Lua脚本环境搭建

    第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...

  7. redis中使用lua脚本

    lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...

  8. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

  9. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

随机推荐

  1. java 字符串String.intern()方法学习

    在jdk1.6与jdk1.7中,String类中的intern()方法实现的原理是有一些差异的.1.在jdk1.6中,intern()方法是先查找字符串常量池是否含有当前字符串,如果没有,那么就在字符 ...

  2. 从零开始部署发布Java项目到服务器的Docker中

    本以为很简单,由于没用过docker和java,本文将会阐述一路遇到的拦路虎. 首先,写好Java项目,本地跑通. 可能会遇到的问题: 1.jar包正常运行,war包404: 如何打包很多教程都有介绍 ...

  3. Spring AOP 实战运用

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  4. 使用metadata-extractor获取照片中的位置、曝光度、大小...

    使用metadata-extractor实现获取图片中的属性信息 官网:https://drewnoakes.com/code/exif/ 简介:metadata-extractor允许您通过简单的A ...

  5. MySQL中的排序

    在编写SQL 语句时常常会用到 order by 进行排序,那么排序过程是什么样的?为什么有些排序执行比较快,有些排序执行很慢?又该如何去优化? 索引排序 索引排序指的是在通过索引查询时就完成了排序, ...

  6. Java学习日报7.20

    //7.20 三个和尚比身高import java.util.Scanner; //导包public class Hello{ public static void main(String[] arg ...

  7. Centos7无网络下安装mysql5.7——mysql-rpm安装

    本教程指将mysql安装到系统默认目录下,如想自定义修改目录,请在rpm安装时自行修改: rpm -ivh --prefix= /opt xxx.rpm #将xxx.rpm安装到/opt下 一.下载m ...

  8. U盘使用技巧篇 制作一般人删除不了的文件(宣传视频) (量产开卡)

    一. 视频制作成ISO ,放好 视频  图标文件 制作工具 : UltraISO 图标制作: 插入光盘状态:用autorun.inf格式:[autorun]open=Install.exe 点击光盘时 ...

  9. Netty学习之IO模型

    目录 1.1 同步.异步.阻塞.非阻塞     同步 VS 异步         同步         异步     阻塞 VS 非阻塞         阻塞         非阻塞     举例   ...

  10. (解决)easypoi图片导出只占用一个单元格

    @ 目录 前提 依赖环境 问题原因 解决方案 重写jar中的方法 原理 前提 本解决方案来源于网络,因解决自己需求,因此自行记录起来,如有侵权请联系我. 依赖环境 easypoi--依赖版本3.1.0 ...