
重试机制的常见应用场景重试机制是分布式系统和网络编程中一种常见的容错策略主要用于应对临时性故障。以下是典型的应用场景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(); }