wordpress 后台加入链接后_网站显示是标签_不是链接,备案网站管理系统,二手域名交易平台,网站怎么推广效果最好微服务设计模式 - 重试模式#xff08;Retry Pattern#xff09; 定义
重试模式#xff08;Retry Pattern#xff09;是一种微服务中的设计模式#xff0c;用于在临时性失败#xff08;如网络故障或暂时不可用的服务#xff09;发生时#xff0c;自动重新尝试请求Retry Pattern 定义
重试模式Retry Pattern是一种微服务中的设计模式用于在临时性失败如网络故障或暂时不可用的服务发生时自动重新尝试请求而不是立即返回错误。通过重试可以增加操作成功的概率从而提高系统的可靠性。
结构
重试模式通常包括以下几个组件
调用者发起请求的实体。操作需要重试的操作比如API调用或数据库操作。重试策略定义重试次数、间隔时间和重试条件的策略。
工作原理 重试模式的工作原理如下
调用者发起请求。执行操作如果成功则返回结果如果失败则进入重试策略。重试策略检查是否满足重试条件如最大重试次数未达到、错误类型允许重试等。如果满足条件则按照重试策略重新请求操作否则返回最终失败结果。
优点 提高可靠性在遇到暂时性故障时通过重试机制增加操作成功的机会。 增强用户体验避免频繁的错误提示提高用户的满意度。 灵活性通过配置不同的重试策略适应不同的业务需求。
使用场景
重试模式Retry Pattern在很多场景中非常有用尤其是在处理临时性故障transient faults的时候。下面列举了几种典型的使用场景
网络通信问题 网络抖动在面临暂时性网络抖动或不稳定时重试可以帮助确保请求成功。网络超时一些网络请求可能超时如果这些超时是临时的那么可以通过重试来解决问题。 外部API调用 第三方服务不稳定在调用外部API或第三方服务时如果这些服务偶尔不稳定通过重试可以增加成功的概率。API限流外部API可能会对请求数量进行限流导致部分请求被拒绝重试可以在稍后的时间段重新发送请求。 数据库操作 数据库连接中断数据库连接可能偶尔中断通过重试机制可以重新建立连接。锁定结果在高并发情况下某些数据库操作可能会因行锁或表锁被暂时阻塞通过重试可以等待锁释放。 消息队列 消息消费失败在处理消息队列中的消息时如果某些消息因临时性问题处理失败可以通过重试机制重新处理这些消息。 分布式系统 服务依赖在分布式系统中多个微服务之间相互依赖如果某个服务临时不可用通过重试可以确保请求最终成功。 其他临时性错误 资源限制某些临时性资源限制如内存不足或CPU过载可能导致操作失败通过重试可以等待资源恢复。维护或升级某些服务可能在维护或升级过程中短暂不可用重试机制可以在服务恢复后继续尝试请求。
影响因素
在实现重试模式时我们需要考虑多个重要因素包括幂等性Idempotency、事务一致性Transaction Consistency、性能影响和异常类型以确保系统的可靠性和有效性。
以下具体介绍每一个影响因素并以SrpingBoot相关代码以及resilience4j用以实现重试模式相关配置进行辅助说明。
幂等性Idempotency
定义幂等性是指在相同条件下多次执行操作结果应保持一致。换句话说幂等操作在被执行一次或多次后对系统的状态产生相同的影响。
重要性重试模式通常会多次执行相同操作因此确保操作的幂等性是至关重要的。若操作不具有幂等性可能会导致数据不一致或重复处理。
实现示例
对于HTTP请求可以使用HTTP动词来区分幂等操作。例如PUT和DELETE通常为幂等操作而POST可能不是。在数据库写操作时添加唯一约束或在应用层实现幂等逻辑。
示例代码 - 幂等性操作
Service
public class IdempotentService {Autowiredprivate OrderRepository orderRepository;Retry(name idempotentService, fallbackMethod fallback)public String createOrder(Order order) {// 检查订单是否已经存在即幂等性检查OptionalOrder existingOrder orderRepository.findByOrderId(order.getOrderId());if (existingOrder.isPresent()) {return Order already exists;}// 创建新订单orderRepository.save(order);return Order created successfully;}private String fallback(Order order, Exception e) {return Fallback response;}
}事务一致性Transaction Consistency
定义事务一致性确保在一组操作中所有操作要么全部成功要么全部失败从而保证系统状态的一致性。
挑战重试机制可能跨越多个事务且每次重试都应当考虑事务的一致性问题。未能维护一致性可能导致数据混乱或部分提交的问题。
实现示例
在Java中使用Spring的Transactional注解来管理事务一致性。在分布式系统中使用2PC两阶段提交或Saga模式等事务管理策略。
示例代码 - 事务一致性
Service
public class TransactionalService {Autowiredprivate OrderRepository orderRepository;TransactionalRetry(name transactionalService, fallbackMethod fallback)public String createOrderTransactional(Order order) {// 创建新订单orderRepository.save(order);// 下单后其他相关操作...return Order created successfully with transaction;}private String fallback(Order order, Exception e) {return Fallback response in transaction;}
}性能影响Impact on Performance
定义重试机制可能引入额外的延迟和资源消耗因此需要谨慎管理以减少性能影响。
优化策略
限次数限制重试次数避免无限重试。指数退避每次重试时增加等待时间减少系统负载。快速失败在明显不可恢复的情况下尽早返回错误而不是反复重试。
实现示例
配置如maxAttempts和waitDuration等参数来控制重试策略。
示例配置 - 性能相关
resilience4j.retry:instances:myService:max-attempts: 3wait-duration: 500msmax-wait-duration: 2sexponential-backoff:multiplier: 2异常类型Exception Type
定义不同类型的异常可能需要不同的重试策略。有些异常是暂时性的可以通过重试解决另一些则是不可恢复的不应重试。
实现示例
使用防御性编程和异常分类来确定哪些异常应该触发重试。自定义重试规则来处理不同类型的异常。
示例代码 - 异常类型识别
Service
public class ExceptionHandlingService {Retry(name exceptionHandlingService, fallbackMethod fallback, retryExceptions {TemporaryException.class }, ignoreExceptions { PermanentException.class })public String handleService() {// 假设某操作可能抛出TemporaryException或PermanentExceptionriskyOperation();return Operation completed;}private void riskyOperation() throws TemporaryException, PermanentException {// 实现一些逻辑可能抛出不同类型的异常}private String fallback(Exception e) {return Fallback response for exceptions;}
}重试策略
在实现重试模式时选择合适的重试策略Retry Strategy是至关重要的。不同的重试策略会影响系统的可靠性、性能和响应时间。以下是常见的重试策略
固定间隔重试Fixed Interval Retry
定义固定间隔重试策略在每次重试之间使用相同的时间间隔。例如重试每次间隔500毫秒。
优点实现简单适用于简单的重试场景。
缺点在高负载或问题持续存在的情况下可能会导致系统过载。
示例配置
resilience4j.retry:instances:myService:max-attempts: 3wait-duration: 500ms指数退避重试Exponential Backoff Retry
定义每次重试时等待时间逐步增加。例如第一次重试后等待500毫秒第二次重试后等待1秒第三次重试后等待2秒以此类推。
优点逐步增加的等待时间可以有效减少系统负载适用于网络抖动或外部服务不稳定的情形。
缺点实现稍微复杂可能导致较长的重试时间。
示例配置
resilience4j.retry:instances:myService:max-attempts: 3wait-duration: 500msexponential-backoff:multiplier: 2抛出异常后退避重试Backoff with Jitter Retry
定义在指数退避的基础上加入随机时间间隔称为“抖动”以避免重试请求出现峰值。
优点通过在重试间隔中加入随机性进一步减少了系统因重试请求同时发出的风险适用于高并发场景。
缺点实现复杂度更高。
示例代码Java示例
RetryConfig config RetryConfig.custom().maxAttempts(3).waitDuration(Duration.ofMillis(500)).retryOnException(throwable - throwable instanceof TemporaryException).intervalFunction(IntervalFunction.ofExponentialBackoff(500, 2).withRandomizedWait()).build();增量退避重试Incremental Backoff Retry
定义每次重试等待时间按照固定的增量增加。例如第一次重试后等待500毫秒第二次重试后等待1秒第三次重试后等待1.5秒。
优点控制每次重试的等待时间增加量简单易理解。
缺点在一定情况下性能可能不如指数退避策略。
示例代码
resilience4j.retry:instances:myService:max-attempts: 3wait-duration: 500msinterval-function:increment-interval:interval: 500ms固定次数重试Retry with Max Attempts
定义限制重试的次数当超过重试次数时停止重试。
优点防止过多重试导致资源消耗保护系统稳定。
缺点可能导致在某些情况下无效重试。
示例代码
resilience4j.retry:instances:myService:max-attempts: 5wait-duration: 500ms自定义重试策略Custom Retry Strategy
定义根据特定的业务需求和场景设计定制化的重试策略。
优点灵活、满足特定需求。
缺点需要更多的开发和测试工作。
示例代码Java自定义实现
RetryConfig config RetryConfig.custom().maxAttempts(5).intervalFunction(IntervalFunction.of(Duration.ofMillis(500), IntervalFunction.of(Random::nextGaussian))).retryOnException(throwable - {// Define your custom retry condition here.return throwable instanceof TemporaryException;}).build();综合以上在选择重试策略时建议如下
分析场景根据实际业务场景选择合适的重试策略。例如网络波动适合使用指数退避重试。测试不同策略通过负载测试和性能测试评估不同重试策略对系统的实际影响。结合多种策略可以组合多个重试策略例如固定次数重试加上指数退避满足更复杂的需求。监控与调整定期监控重试机制的效果根据实际情况动态调整重试策略。
完整实例代码
这个示例展示了如何在Spring Boot应用中使用Resilience4j实现重试模式。配置文件中定义了重试策略包括最大尝试次数、等待时间和指数退避参数。服务层通过重试注解Retry实现重试逻辑并在错误情况下调用回退方法。通过这一模式系统可以有效应对各种临时性故障提高整体的可靠性和稳定性。
项目结构
.
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── retry/
│ │ │ ├── RetryApplication.java
│ │ │ ├── controller/
│ │ │ │ └── RetryController.java
│ │ │ ├── service/
│ │ │ │ └── RetryService.java
│ │ │ └── exception/
│ │ │ ├── TemporaryException.java
│ │ │ └── PermanentException.java
│ │ ├── resources/
│ │ │ ├── application.yaml
└── pom.xmlMaven 依赖
首先在Maven的pom.xml文件中添加Resilience4j依赖项
dependencies!-- Spring Boot dependencies --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Resilience4j dependencies --dependencygroupIdio.github.resilience4j/groupIdartifactIdresilience4j-spring-boot2/artifactIdversion1.7.1/version/dependencydependencygroupIdio.github.resilience4j/groupIdartifactIdresilience4j-retry/artifactIdversion1.7.1/version/dependency
/dependenciesRetry配置
在Spring Boot应用程序的配置文件application.yaml中配置Resilience4j的重试策略
resilience4j.retry:instances:myService:max-attempts: 5wait-duration: 500msexponential-backoff:multiplier: 2retry-exceptions:- com.example.retry.exception.TemporaryExceptionignore-exceptions:- com.example.retry.exception.PermanentException代码说明
RetryApplication.java
主应用程序文件
package com.example.retry;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class RetryApplication {public static void main(String[] args) {SpringApplication.run(RetryApplication.class, args);}
}RetryController.java
控制器类
package com.example.retry.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import com.example.retry.service.RetryService;RestController
public class RetryController {Autowiredprivate RetryService retryService;GetMapping(/retry-test)public ResponseEntityString retryTest() {return ResponseEntity.ok(retryService.callExternalService());}
}RetryService.java
服务层实现重试逻辑
package com.example.retry.service;import org.springframework.stereotype.Service;
import io.github.resilience4j.retry.annotation.Retry;
import com.example.retry.exception.TemporaryException;
import com.example.retry.exception.PermanentException;Service
public class RetryService {Retry(name myService, fallbackMethod fallback)public String callExternalService() throws TemporaryException, PermanentException {// 模拟外部服务调用double random Math.random();if (random 0.5) {throw new TemporaryException(Temporary issue occurred);} else if (random 0.8) {throw new PermanentException(Permanent issue occurred);}return Success;}private String fallback(Exception e) {return Fallback response: e.getMessage();}
}TemporaryException.java
自定义临时异常类型
package com.example.retry.exception;public class TemporaryException extends Exception {public TemporaryException(String message) {super(message);}
}PermanentException.java
自定义永久异常类型
package com.example.retry.exception;public class PermanentException extends Exception {public PermanentException(String message) {super(message);}
}类序列图 运行测试
运行Spring Boot应用程序后访问 http://localhost:8080/retry-test 可以触发重试逻辑。根据随机数的不同有时会成功有时会触发临时异常进行重试如果次数用尽则返回回退响应。
总结 在云计算和微服务架构中重试模式是一种重要的设计模式通过处理暂时性故障来增强系统的可靠性。当实现重试模式时必须考虑幂等性、事务一致性、性能影响和异常类型以确保系统的整体稳定性和正确性。Resilience4j库提供了实现重试模式的便利方法通过合理配置可以满足各种不同的业务需求。希望本文能帮助您更好地理解和选择合适的重试策略为系统设计和实现提供参考。 文章转载自: http://www.morning.gmjkn.cn.gov.cn.gmjkn.cn http://www.morning.skpdg.cn.gov.cn.skpdg.cn http://www.morning.lfpdc.cn.gov.cn.lfpdc.cn http://www.morning.jghqc.cn.gov.cn.jghqc.cn http://www.morning.wnywk.cn.gov.cn.wnywk.cn http://www.morning.fthcq.cn.gov.cn.fthcq.cn http://www.morning.xymkm.cn.gov.cn.xymkm.cn http://www.morning.fkffr.cn.gov.cn.fkffr.cn http://www.morning.lgmty.cn.gov.cn.lgmty.cn http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn http://www.morning.bhpsz.cn.gov.cn.bhpsz.cn http://www.morning.nrddx.com.gov.cn.nrddx.com http://www.morning.ngqty.cn.gov.cn.ngqty.cn http://www.morning.hlkxb.cn.gov.cn.hlkxb.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.qinhuangdjy.cn.gov.cn.qinhuangdjy.cn http://www.morning.hnmbq.cn.gov.cn.hnmbq.cn http://www.morning.bpmtl.cn.gov.cn.bpmtl.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.rnmc.cn.gov.cn.rnmc.cn http://www.morning.sxlrg.cn.gov.cn.sxlrg.cn http://www.morning.rlksq.cn.gov.cn.rlksq.cn http://www.morning.hkswt.cn.gov.cn.hkswt.cn http://www.morning.mhsmj.cn.gov.cn.mhsmj.cn http://www.morning.sxmbk.cn.gov.cn.sxmbk.cn http://www.morning.khzml.cn.gov.cn.khzml.cn http://www.morning.wtcd.cn.gov.cn.wtcd.cn http://www.morning.taojava.cn.gov.cn.taojava.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.kkgbs.cn.gov.cn.kkgbs.cn http://www.morning.ltbwq.cn.gov.cn.ltbwq.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn http://www.morning.htrzp.cn.gov.cn.htrzp.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.tqdqc.cn.gov.cn.tqdqc.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.c7493.cn.gov.cn.c7493.cn http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.ranglue.com.gov.cn.ranglue.com http://www.morning.xjkr.cn.gov.cn.xjkr.cn http://www.morning.yqhdy.cn.gov.cn.yqhdy.cn http://www.morning.ggmls.cn.gov.cn.ggmls.cn http://www.morning.hfxks.cn.gov.cn.hfxks.cn http://www.morning.yydzk.cn.gov.cn.yydzk.cn http://www.morning.srtw.cn.gov.cn.srtw.cn http://www.morning.jzxqj.cn.gov.cn.jzxqj.cn http://www.morning.rnyhx.cn.gov.cn.rnyhx.cn http://www.morning.xqtqm.cn.gov.cn.xqtqm.cn http://www.morning.fyskq.cn.gov.cn.fyskq.cn http://www.morning.kdpal.cn.gov.cn.kdpal.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.qrhh.cn.gov.cn.qrhh.cn http://www.morning.pjbhk.cn.gov.cn.pjbhk.cn http://www.morning.fdxhk.cn.gov.cn.fdxhk.cn http://www.morning.cznsq.cn.gov.cn.cznsq.cn http://www.morning.wqfj.cn.gov.cn.wqfj.cn http://www.morning.cpzkq.cn.gov.cn.cpzkq.cn http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn http://www.morning.zgdnz.cn.gov.cn.zgdnz.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.cgstn.cn.gov.cn.cgstn.cn http://www.morning.jjzxn.cn.gov.cn.jjzxn.cn http://www.morning.rxdsq.cn.gov.cn.rxdsq.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.gwwky.cn.gov.cn.gwwky.cn http://www.morning.mlpmf.cn.gov.cn.mlpmf.cn http://www.morning.mxhgy.cn.gov.cn.mxhgy.cn http://www.morning.gyqnp.cn.gov.cn.gyqnp.cn http://www.morning.cnfjs.cn.gov.cn.cnfjs.cn http://www.morning.npcxk.cn.gov.cn.npcxk.cn http://www.morning.tdcql.cn.gov.cn.tdcql.cn http://www.morning.xtlty.cn.gov.cn.xtlty.cn http://www.morning.smfbw.cn.gov.cn.smfbw.cn http://www.morning.jtfcd.cn.gov.cn.jtfcd.cn http://www.morning.gnjkn.cn.gov.cn.gnjkn.cn http://www.morning.ckwrn.cn.gov.cn.ckwrn.cn http://www.morning.hwbf.cn.gov.cn.hwbf.cn