服务降级 托底预案 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 ...
随机推荐
- (三)文件的链接(ln)
一.链接的分类及特点 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link ...
- Apache Calcite 论文学习笔记
特别声明:本文来源于掘金,"预留"发表的[Apache Calcite 论文学习笔记](https://juejin.im/post/5d2ed6a96fb9a07eea32a6f ...
- Guns自动化生成代码使用
一.Guns简介 Guns基于Spring Boot2,致力于做更简洁的后台管理系统.包含系统管理,代码生成,多数据库适配,SSO单点登录,工作流,短信,邮件发送,OAuth2登录,任务调度,持续集成 ...
- CentOS7 实战源码部署php服务与nginx 的整合
简介:实战演练php服务的搭建 PHP是一种脚本语言,常用于做动态网站的. 源码编译安装: 安装依赖组件: yum -y install gcc gcc-c++ bzip2 bzip2-devel b ...
- 记录第一次使用Vivado——以全加器为例子
从altera转战xilinx,经典的FPGA到ZYNQ系列,第一站就是先熟悉编译软件Vivado.我就直接跳过软件安装部分了,如有疑问,可以在评论区提出来,我看到了就帮你解答. 首先是是打开界面 然 ...
- 读取 excel文件组装字典数据
package com.murong.ecp.app.mbu.action.bmbuurm8; import java.io.FileOutputStream;import java.io.Outpu ...
- Java将List中的实体按照某个字段进行分组的算法
public void test() { List<User> list = new ArrayList<>(); //User 实体 测试用 String id,name; ...
- 什么情况下调用doGet()和doPost()?
默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法: 为get的时候,调用deGet()方法.
- python的22个基本语法
"人生苦短,我用Python".Python编程语言是最容易学习.并且功能强大的语言.只需会微信聊天.懂一点英文单词即可学会Python编程语言.但是很多人声称自己精通Python ...
- java位运算符生产环境应用分析
在实际应用场景中 特别是 1,2,4,8,16 这种2的整数次幂的数字,因为具有非常典型的特点 首先是 1.2.4 这几位数了,因为他们的特点就是二进制只有一个为 1 的位,其他位都是 0,并同其他数 ...