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. 微服务 - 服务消费(七)Feign

    介绍 Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单.我们只需要通过创建接口并用注解来配置它既可完成对Web ...

  2. python使用smtplib和email库发送邮件

    国内很多服务器提供商都默认禁止了smtp默认的25端口服务,而启用465端口发送邮件 在smtplib库中直接调用SMTP_SSL就是默认使用465端口 示例代码如下: def send_eamil( ...

  3. [leetcode349]Intersection of Two Arrays

    设计的很烂的一道题 List<Integer> res = new ArrayList<>(); // int l1 = nums1.length; // int l2 = n ...

  4. 当Thymeleaf遇到向js中传值的操作

    在使用Thymeleaf的时候.关于一些点击操作非常头疼.往往需要向JS里面传递各种东西. 然而,在用Thymeleaf的时候.js操作需要拼接语句.但是又不好拼接. 关于一些操作,一般也是在表格中. ...

  5. Java学习日报9.22

    /* * 信1905-2班 * 杨传伟 * 2020.9.22 * 20194074 * 账号密码默认 666666 */package atm; import java.util.*;public ...

  6. go语言的下载、安装、配置

    一.下载 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Windows 安装包下载地址为:https://golang.org/dl/. 如果打不开可 ...

  7. ASP.NET Core Controller与IOC的羁绊

    前言 看到标题可能大家会有所疑问Controller和IOC能有啥羁绊,但是我还是拒绝当一个标题党的.相信有很大一部分人已经知道了这么一个结论,默认情况下ASP.NET Core的Controller ...

  8. 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令

    小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...

  9. CS系统中分页控件的制作

    需求:在一个已有的CS项目(ERP中),给所有的列表加上分页功能. 分页的几个概念: 总记录数  totalCount (只有知道了总记录数,才知道有多少页) 每页记录数  pageSize (根据总 ...

  10. Vue.nextTick()的使用

    什么是Vue.nextTick()?? 定义:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 所以就衍生出了这个获取更新后的DOM的Vue方法.所 ...