当前位置: 首页 > news >正文

重试机制应用

重试机制的常见应用场景

重试机制是分布式系统和网络编程中一种常见的容错策略,主要用于应对临时性故障。以下是典型的应用场景:

1.网络通信场景

  • 网络抖动:数据传输过程中因网络不稳定导致的丢包或延迟
  • 连接超时:客户端与服务端建立连接超时
  • DNS 解析失败:域名解析临时失败

2.微服务调用

  • 服务暂时不可用:目标服务正在重启、发布或临时过载
  • 负载均衡切换:请求命中了异常节点,重试时可能被路由到健康节点
  • 下游依赖超时:调用的下游服务响应超时

3.数据库操作

  • 连接池耗尽:数据库连接池暂时无可用连接
  • 死锁或锁等待:事务发生冲突,重试时可能成功获取锁
  • 主从切换:数据库主从切换期间的短暂不可用

4.消息队列

  • 消息投递失败:Broker 暂时不可达
  • 消费端处理失败:消费者处理消息时发生临时性异常
  • 死信队列处理:消息多次消费失败后进入死信队列,人工干预后重试

5.第三方接口调用

  • 支付回调:第三方支付平台回调通知失败
  • 短信/邮件发送:网关拥堵或限流
  • 第三方 API 限流:触发对方限流策略,需要等待后重试

6.分布式事务

  • Confirm/Cancel 失败:TCC、SAGA 模式中某个步骤失败
  • 分布式锁获取失败:抢锁失败后重试获取

7.缓存操作

  • 缓存穿透/击穿:缓存失效瞬间大量请求打到数据库,重建缓存后重试
  • 缓存更新失败:Redis 连接抖动导致写入失败

重试次数/间隔控制

  • 最大重试次数:3次足够(最多5次)
  • 初始间隔:1秒以上(避免瞬间压垮对方服务)
  • 最大间隔:10秒以内(避免用户体验差)

为什么需要退避策略

退避策略是重试机制的核心灵魂,直接决定了重试的效率与安全性。核心思想是:每次重试之间增加等待时间,避免连续请求压垮对方服务。无退避的危险,瞬间爆发的重试流量会导致对方服务雪崩式崩溃,最终双方都不可用。

数据库重连机制

mysql出现ERROR : (2006, 'MySQL server has gone away')服务器在执行查询前已经关闭了连接。重连机制

/** * 获取连接. * * @param string $url * * @return Connection|null * * @throws \Exception */ protected function getConn($url) { $conn = null; for ($times = 1; $times <= 3; ++$times) { try { $config = new Configuration(); $conn = DriverManager::getConnection( array( 'url' => $url, 'driver' => 'pdo_mysql', ), $config ); break; } catch (\Exception $e) { $sleepTime = $times * 60 > 180 ? 180 : $times * 60; sleep($sleepTime); $logger->error(sprintf('第【%s】次获取数据库mysql连接异常, 异常信息为【%s】', $times, $url, $e->getMessage())); } } return $conn; } public function checkDbGoneAway($conn) { $result = true; try { $conn->execute("select 1"); } catch (\Exception $e) { $errMsg = $e->getMessage(); $errCode = $e->getCode(); if (2006 === $errCode && false !== strpos($errMsg, 'server has gone away')) { $result = false; } } return $result; }

系统自带ping方法,不通不会出现异常

if (false === $conn->ping()) { $conn->close(); $conn->connect(); }
http://www.cnnetsun.cn/news/4160013.html

相关文章:

  • Linux服务器CPU使用率100%排查:从top命令到jstack与perf的完整实战指南
  • 把 Kafka 当队列用,丢了 0.3% 的消息:Kafka 与 RocketMQ 在可靠性、顺序、事务上的 4 笔真实账
  • KMS_VL_ALL_AIO 本地KMS快速激活指南:从零到一,一个批处理搞定 Windows 和 Office 激活
  • ol-ext 上手实操手册:OpenLayers 地图扩展库核心能力拆解
  • `import fnmatch` 是 Python 中导入标准库模块 `fnmatch` 的语句
  • 主题公园移动供电案例:从环球影城场景,看户外频繁插拔工况下工业连接器选型思路
  • 读懂eas.json:expo-react-native-cicd中dev、prod-apk、prod-aab三大构建Profile配置详解
  • PyULog:8条命令解析PX4 ULog日志,导出CSV、KML与SQLite
  • RDMA数据传输操作:Send/Recv与Read/Write全解析
  • AnythingLLM 教程:10 分钟搭建一个本地私有知识库问答应用
  • Element Tiptap富文本编辑器:Vue3项目5分钟接入带菜单的WYSIWYG编辑器
  • SPA 刷新 404 难题终结者:boot-react SinglePageAppConfig pushState 资源解析器深度剖析
  • 我的价值观
  • 如何使用 draw.io 桌面版:离线绘图与批量导出完整指南
  • CEdev 图形编程完全指南:graphx 库调色板、精灵动画与 Tilemap 实战教程
  • iOS跨平台位置模拟实战:基于WebKit调试协议实现GeoPort方案
  • Weasis:内建 2D/3D 影像分析的开源 DICOM 查看器
  • res-downloader完全教程:免费的跨平台资源嗅探器,一键下载视频音乐图片
  • PhoneProfilesPlus新手必学的8个实用场景:会议自动静音、通勤一键飞行模式
  • 让Claude Code、Codex与Gemini协同工作:Agent Relay Harnesses完整指南
  • 训练UniDetector前必看的20+个关键超参数:完整配置项逐条解读
  • 快速上手solid-dnd:10分钟从零搭建你的第一个拖拽应用,新手友好教程
  • 如何系统掌握高级数据结构?AlgorithmsAndDataStructuresInAction官方代码库入门指南
  • Vue-preview 图片预览:新手安装与上手完整指南
  • ShawzinBot:免费把 MIDI 变成游戏按键
  • 如何重置 Navicat 试用期:3 条命令跑通 navicat-key 注册表清理工具
  • ODC 生产环境部署最佳实践:MetaDB、Docker 与高可用架构配置全解析
  • 让联邦查询提速10倍:aws-athena-query-federation谓词下推、分区裁剪与TopN优化实战
  • MobilityDB高精度建模:tpose四元数姿态类型如何描述自动驾驶与机器人运动
  • TeslaLogger新功能MCP Server详解:用自然语言向AI查询你的特斯拉数据