简介

由于某些场景下服务提供方和调用方都无法做到可用性,当系统远程调用时,可能会因为某些接口变慢导致调用方大量HTTP连接被阻塞而引发雪崩。

解决思路如下:

  • 服务提供方实现接口快速失败,当处理时间达到一定阈值时,直接返回失败。需要服务提供方配合改造。
  • 服务提供方在反向代理层增加proxy_timeout配置。如果配置了upstream max_fails,可能会导致所有的服务实例都被踢掉。而不配置max_fails则出问题的时间段内这个接口每次调用都会在proxy_timeout时间才能返回超时。
  • 服务接入方调用远程接口失败时触发熔断,一定时间内不在调用远程服务。需要服务接入方配合改造。

综上,这个问题服务提供方和接入方分别做到快速失败和熔断降级,就可以很好的决解。但是某些业务场景,服务提供方和接口方都无法改进时,我们只好在反向代理层想办法。

思路

在nginx中利用lua脚本实现断路器功能。

  • 定义ngx.shared.DICT字典,用于记录每个接口的熔断状态和超时次数,超时次数和熔断状态2个字典,减少锁几率

  • 在init_worker_by_lua阶段定义定时任务,用户清空超时次数和对已经打开一段时间的断路器设为半开

  • 在access_by_lua阶段执行判断,判断当前请求是否熔断。已熔断则直接返回失败。

  • 在log_by_lua阶段判断请求是否超时,如超时则记录超时次数并更新熔断器状态。

nginx 配置说明

  • RestyCircuitBreaker.lua 放至lua脚本文件夹

  • http段定义字典:

      lua_shared_dict resty_circuit_breaker_dict 2M;
    lua_shared_dict resty_circuit_breake_timeout_dict 10M;
  • http段 执行init_by_lua脚本:

      restyCircuitBreaker = require("RestyCircuitBreaker").init("pdc")
  • http段 执行init_worker_by_lua脚本:

      restyCircuitBreaker:set_background()
  • server或者location段 执行access_by_lua脚本:

      restyCircuitBreaker:run()
  • server或者location段 执行log_by_lua脚本:

      restyCircuitBreaker:set_bucket()
  • 通过prometheus查看断路器状态

      # HELP circuit_status 断路器状态
    # TYPE circuit_status gauge
    circuit_status{system="pdc",url="/marketing/get_info"} 2
    # HELP circuit_time 断路打开时间
    # TYPE circuit_time counter
    circuit_time{system="pdc",url="/marketing/get_info"} 10

github地址:https://github.com/lazio10000/RestyCircuitBreaker

RestyCircuitBreaker --- openresty断路器的更多相关文章

  1. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  2. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  3. openresty 前端开发入门六之调试篇

    大多数情况下,调试信息,都可以通过ngx.say打印出来,但是有的时候,我们希望打印调试日志,不影响到返回数据,所以系统打印到其它地方,比如日志文件,或者控制台 这里主要用到一个方法就是ngx.log ...

  4. openresty 前端开发序

    还记得第一次尝试前后端分离的时候,是使用nginx + react 构建的spa应用,后端是java,主要处理业务逻辑逻辑部分,返回json数据,在nginx里面配置好html + js纯静态文件,再 ...

  5. openresty 前端开发入门一

    OpenResty ™ 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...

  6. mac下openresty安装

    //openresty安装 http://openresty.org/ brew updatebrew install pcre openssl ./configure --prefix=/usr/l ...

  7. 如何在openresty里解析域名

    转:原文:http://hambut.com/2016/09/09/how-to-resolve-the-domain-name-in-openresty/?utm_source=tuicool&am ...

  8. Circuit Breaker Pattern(断路器模式)

    Handle faults that may take a variable amount of time to rectify when connecting to a remote service ...

  9. 用Nginx+Lua(OpenResty)开发高性能Web应用

    在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...

随机推荐

  1. Android接口Parcelable的使用

    注明:非原创,转载,原链接地址为:http://www.2cto.com/kf/201205/132814.html 和 http://www.blogjava.net/lincode/archive ...

  2. 基于STM32L4的开源NBIOT开发资料

    基于STM32L4的开源NBIOT开发资料 1. 参考路径:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=615 ...

  3. css2d 3d

    2D转换 1.rotate()   旋转 <!DOCTYPE html><html> <head> <meta charset="UTF-8&quo ...

  4. 别人的Linux私房菜(14)Linux账号管理和ACL权限设置

    用户标识符UID.GID 用户的账号信息,主要是指UID对应.组和GID对应 检查系统中是否存在用户bin:id bin 登录shell验证账号密码的步骤:找到/etc/passwd核对是否存在账号, ...

  5. 20175316盛茂淞 2018-2019-2 《Java程序设计》第6周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 第7章 内部类与异常类 1.使用 try.catch Java中所有信息都会被打包为对 ...

  6. 第三周助教工作总结——NWNU李泓毅

    本周点评作业数量:第一部分是第一篇博客的剩余部分,给出了共计22份作业的具体分数.第二部分是第二篇博客的已提交部分共计19份作业. 这是我的博客地址:https://www.cnblogs.com/N ...

  7. 企业微信自建应用移动端动态获取li并给其事件问题总结

    前段时间一个项目增加企业微信移动端应用,其中几个小功能用到ul-li列表点击并获得相应数据: 开始用var lis=$('#ul li'); for(var=i;i<lis.length;i++ ...

  8. 《Linux就该这么学》第十三天课程

    使用Apache服务部署静态网站 原创地址:https://www.linuxprobe.com/chapter-10.html 今天学了Apache,这只是RHCE课程的开始,估计后面越来越难 今天 ...

  9. Python的基本类型介绍和可变不可变

    Python的基本类型介绍 前言 做python有一段时间了,从工作开始就在不断地学习和积累.但是有时候用到一些技术点,甚至是基础知识的时候,总是会遗忘.所以,从今天开始,就在这里记录下来,不仅可以分 ...

  10. 配置json-server

    1.全局安装json-server[可能需要管理员权限] npm i -g json-server 2.创建文件夹jsonerver,初始化package.json文件npm init 3.局部安装j ...