OpenResty 怎么使用 Lua 脚本实现请求重试与故障自动转移

落萱姑娘_6882

落萱姑娘_6882

2026-09-09

646人浏览

原创

openresty可通过resty.http实现可控的带指数退避的lua层请求重试,支持连接/读写超时设置、错误捕获及状态码判断,无需依赖nginx原生upstream重试机制。

openresty 怎么使用 lua 脚本实现请求重试与故障自动转移

OpenResty 通过 Lua 脚本可灵活实现请求重试与故障自动转移,核心在于利用 resty.http 客户端的连接/读写超时控制、错误捕获机制,配合 upstream 的健康检查或手动状态维护,实现服务降级与流量切换。

使用 resty.http 实现带退避的请求重试

在 Lua 中调用远程服务时,不依赖 Nginx 原生 upstream 重试(如 proxy_next_upstream),而是由 Lua 主动控制重试逻辑,更可控、可定制。

  • 引入 resty.http 模块,创建复用的 http 对象(推荐用 cosocket 连接池)
  • 设置合理的超时:connect_timeout(建连)、send_timeout(发包)、read_timeout(收包),避免长阻塞
  • 对常见失败类型(如 connection refused、timeout、502/503/504)进行捕获并重试
  • 加入指数退避(exponential backoff),例如第 1 次延时 0.1s,第 2 次 0.2s,第 3 次 0.4s

示例片段:

local httpc = require "resty.http".new()
httpc:set_timeouts(1000, 1000, 2000) -- conn/send/read ms

for i = 1, 3 do
  local res, err = httpc:request_uri("https://api.example.com/v1/data", {
    method = "GET",
    headers = { ["X-Request-ID"] = ngx.req.get_headers()["X-Request-ID"] }
  })
  if res and res.status >= 200 and res.status     return ngx.say(res.body)
  end
  if i     ngx.sleep(0.1 * (2 ^ (i - 1))) -- 退避延迟
  end
end
ngx.status = 502
ngx.say("Service unavailable after retries")

基于 upstream 动态健康状态做故障转移

当后端有多个节点(如 A/B/C),可结合 OpenResty 的共享字典(shared dict)记录各节点近期失败次数或响应时间,实现“软健康检查”。

Nginx Hosting
Nginx Hosting

通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。

下载
  • 定义 shared dict 存储节点状态:lua_shared_dict backend_health 10m;
  • 每次请求前查字典,跳过标记为“不可用”的节点;请求失败后更新该节点失败计数
  • 设定阈值(如连续 3 次失败)将节点置为临时下线,并设置自动恢复时间(TTL)
  • 配合 balancer_by_lua* 阶段,动态修改 upstream 分配逻辑(需启用 lua_http10_buffering off)

注意:Nginx 原生 upstream 的 max_fails/fail_timeout 在 OpenResty 中仍生效,但 Lua 层控制更细粒度(例如按 HTTP 状态码区分失败)。

组合 upstream 与 Lua fallback 实现多级容灾

真实场景中常需“主 upstream → 备 upstream → 本地缓存/降级响应”三级策略:

  • 第一层:用标准 upstream + proxy_pass 转发,开启 proxy_next_upstream error timeout http_502 http_503 http_504
  • 第二层:在 error_page 502 503 504 = @fallback 中进入 Lua 处理,尝试调用备用集群或降级接口
  • 第三层:Lua 中读取 lua_shared_dict 中的兜底数据(如预热的 JSON 缓存),或返回静态模板响应

这样既保留 Nginx 高性能转发能力,又赋予 Lua 层业务感知和智能决策能力。

关键注意事项

  • 避免在重试逻辑中阻塞协程:所有 IO 操作必须用 cosocket(即 resty.http),禁用同步 socket 或 system 调用
  • 共享字典操作要加锁(shdict:lock/unlock)或用 CAS(incr + 条件判断)防止并发冲突
  • 重试次数不宜过多(建议 ≤3),尤其对外部 API,避免雪崩或被限流
  • 记录日志时用 ngx.log(ngx.WARN, ...) 而非 print,并带上 trace_id 方便链路追踪

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

nginx

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

457

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

940

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

3012

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

996

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

889

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

454

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2736

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

5112

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

807

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习