服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队
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使用率,当达到阀值时开启限流,让用户排队的更多相关文章
- Nginx 中利用 Lua 脚本做访问控制
使用场景 需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件. 实验环境 Ubuntu 14.04 Nginx 1.4.6 安装 Lua 运行环境 sudo apt-get install ...
- openresty(nginx)中使用lua脚本获取请求IP地址的代码
人狠话不多,直接上代码:------------------------------------------------------------------------------------- lo ...
- 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 ...
- 在redis中使用lua脚本
在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...
- Nginx 内嵌lua脚本,结合Redis使用
0x00 Nginx 内嵌Lua脚本有下面特点: 20k个并发连接 Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能 Lua速度极快(寄存器指令) 0x01 应用场景 在w ...
- C++中嵌入Lua脚本环境搭建
第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...
- redis中使用lua脚本
lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
随机推荐
- Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...
- java数组之binarySearch查找
/** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...
- hashmap简单实现
p.p1 { margin: 0; font: 11px Monaco } p.p2 { margin: 0; font: 11px Monaco; min-height: 15px } p.p3 { ...
- 自动化运维工具-Ansible之3-playbook
自动化运维工具-Ansible之3-playbook 目录 自动化运维工具-Ansible之3-playbook PlayBook初识 YAML语法 PlayBook部署httpd PlayBook实 ...
- Spark Streaming 与Filnk对比分析
转:https://mp.weixin.qq.com/s/jllAegJMYh_by95FhHt0jA
- 阿里云centos7安装mysql8数据库
一.安装mysql 1. mysql官网查找仓库源镜像,选择downloads https://www.mysql.com/downloads/ 2. 找到社区版 3. 选择yum仓库 4. 选择对应 ...
- 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写
摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...
- Tomcat-8.5.23 基于域名和端口的虚拟主机
下载tomcat yum install java -y cd /opt/ wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.23/b ...
- Netty入门一:服务端应用搭建 & 启动过程源码分析
最近周末也没啥事就学学Netty,同时打算写一些博客记录一下(写的过程理解更加深刻了) 本文主要从三个方法来呈现:Netty核心组件简介.Netty服务端创建.Netty启动过程源码分析 如果你对Ne ...
- windows鼠标右键添加快捷方式
[win]+[R] 输入regedit 打开路径:计算机\HKEY_CLASSES_ROOT\DesktopBackground\Shell 创建应用文件,这里以putty为例 右键 Shell 新建 ...