Apache Camel中的短重试与长重试

《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每个模式都基于真实的用例,并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉,以下是该书的重试模式摘录,其中介绍了如何在Apache Camel中进行短期和长期退休。

上下文和问题

从本质上讲,集成应用程序必须通过网络与其他系统进行交互。 随着基于动态云的环境成为规范,并且微服务体系结构将应用程序划分为更细粒度的服务,成功的服务通信已成为许多分布式应用程序的基本前提。 与其他服务进行通信的服务必须能够透明地处理下游系统中可能发生的瞬态故障,并继续运行而不会造成任何中断。 由于可以将瞬态故障视为基础结构级别的故障,网络连接的丢失,繁忙服务所施加的超时和限制等。这些情况很少发生,并且通常会自行纠正,并且通常可以重试操作成功。

力量与解决方案

再现和解释瞬态故障可能是一项艰巨的任务,因为这些故障可能是由不定期发生且与外部系统相关的多种因素造成的。 诸如Chaos Monkey之类的工具可用于模拟不可预测的系统中断,并在需要时让您测试应用程序的弹性。 处理瞬态故障的一个好策略是重试该操作,并希望它能够成功(如果错误确实是瞬态的,它将成功;只要保持镇静并继续重试)。

要实现“重试”逻辑,需要考虑以下几个方面:

重试哪些失败?

某些服务操作(例如HTTP调用和关系数据库交互)是重试逻辑的潜在候选者,但是在实现它之前需要进一步分析。 关系数据库可能会因为限制使用过多资源而拒绝连接尝试,或者由于并发修改而拒绝SQL插入操作。 在这些情况下重试可能会成功。 但是,如果关系数据库由于凭据错误而拒绝连接,或者由于外键约束SQL插入操作失败,则重试该操作将无济于事。 与HTTP调用类似,重试连接超时或响应超时可能会有所帮助,但是重试由业务错误引起的SOAP Fault毫无意义。 因此,请谨慎选择重试次数。

多久重试一次?

一旦确定了重试的必要性,就应该调整特定的重试策略以满足两个应用程序的性质:具有重试逻辑的服务使用者和具有短暂故障的服务提供者。 例如,如果实时集成服务无法处理请求,则可能只允许它在返回响应之前进行几次重试,且延迟很短,而基于批处理的异步服务可能能够承担更多的重试操作。更长的延迟和指数回退。 重试策略还应考虑其他因素,例如服务消耗合同和服务提供商的SLA。 例如,非常激进的重试策略可能会导致服务使用者进一步受到限制,甚至被列入黑名单,或者它可能会使服务完全过载并降级,从而使服务完全无法恢复。 有些API可能会指示您一段时间内的剩余请求计数,并将响应中的信息列入黑名单,但有些API可能不会。 因此,重试策略定义了多久重试一次,以及多长时间之后您才能接受它是非暂时性故障并放弃的事实。

幂等

重试操作时,请考虑对该操作可能产生的副作用。 重试逻辑将消耗的服务操作应设计为幂等的。 使用相同的数据输入重试相同的操作应该没有任何副作用。 想象一个请求已成功处理,但响应尚未返回。 服务使用者可以假设请求失败,然后重试相同的操作,这可能会产生一些意外的副作用。

监控方式

跟踪和报告重试也很重要。 如果某些操作在成功之前不断被重试,或者在失败之前被重试了太多次,则必须识别并修复这些操作。 由于在没有适当监视的情况下,服务中的重试应该对服务使用者透明,因此它们可能未被检测到,并以负面的方式影响了整个系统的稳定性和性能。

超时和SLA

当下游系统发生暂时性故障并且重试逻辑生效时,重试服务的总处理时间将大大增加。 与其从重试和延迟次数的角度考虑重试参数,重要的是从服务SLA和服务使用者超时的角度来驱动这些值。 因此,请考虑处理请求所允许的最大时间,并确定可以挤入该时间范围的最大重试次数和延迟时间(包括处理时间)。

机械学

使用Camel和ActiveMQ有几种不同的重试方法。

骆驼重新交付政策(重试)

这是在骆驼中进行重试的最流行和通用的方法。 重新交付策略定义了重试规则(例如重试和延迟的次数,是否使用冲突避免和指数退避乘数以及日志记录),然后可以将其应用于处理流程的多个errorHandler和onException块。 每当引发异常时,将应用重新交付策略中的规则。

骆驼重新交付政策示例

重试机制的主要区别在于Camel错误处理逻辑不会重试整个路由,而是仅重试处理流程中的失败端点。 这要归功于在骆驼路线中连接端点的通道。 每当处理节点抛出异常时,该异常就会传播回并被通道捕获,然后可以应用各种错误处理策略。 此处的另一个重要区别是基于Camel的错误处理和重新传递逻辑是内存中的,并且它在重试期间会阻塞线程,从而产生后果。 如果所有线程都被阻塞并等待重试,则可能会用完线程。 线程的所有者可以是使用者,也可以是带有来自路由的线程池的某种并行处理结构(例如并行拆分器,收件人列表或线程DSL)。 例如,如果我们有一个带有十个请求处理线程的HTTP使用者,一个繁忙且拒绝连接的数据库以及一个具有指数退避的RedeliveryPolicy,则在十个请求之后,所有线程将最终等待重试,而没有线程将可用于处理新请求。 解决此线程阻塞问题的方法是选择
asyncDelayedRedelivery,其中Camel将使用线程池并异步安排重新交付。 但是线程池将重新交付请求存储在内部队列中,因此此选项可以很快消耗所有堆。 还请记住,所有错误处理程序都有一个线程池,而一个
CamelContext,因此,除非您为持久的重新交付配置了特定的线程池,否则该池可能会在一条路径中耗尽,而在另一条路径中阻塞线程。 另一个含义是,由于重试逻辑在内存中的性质,重新启动应用程序将丢失重试状态,并且将无法分发或保持该状态。

总体而言,这种Camel重试机制非常适合短时本地重试,并且可以克服网络故障或资源短暂锁定的情况。 对于更长的延迟,最好使用具有群集性和非线程阻塞性的持久交付来重新设计应用程序(下面将介绍这种解决方案)。

ActiveMQ经纪人重新交付(长期重试)

该重试机制与前两个机制具有不同的特征,因为它是由代理本身(而不是消息使用者或骆驼路由引擎)管理的。 ActiveMQ借助其调度程序,可以延迟传递消息。 此功能是代理重新交付插件的基础。 重新交付插件可以拦截死信处理并重新安排失败消息以重新交付。 计划将失败的消息传递到原始队列的尾部,然后重新传递给消息使用者,而不是传递给DLQ。 当总消息顺序并不重要,并且消费者之间的吞吐量和负载分配很重要时,这很有用。

ActiveMQ重新交付示例


旁注–我知道,无耻的插件,但是我对这本书的研究感到非常兴奋。 您可以在这里享受40%的折扣,直到6月底为止! 希望你喜欢。 与以前的方法的不同之处在于,该消息在代理消息存储中是持久的,并且在代理或骆驼路由重新启动后仍会继续存在而不会影响重新交付的时间。 另一个优点是,每个重试消息都没有线程被阻塞。 由于消息已返回给代理,因此可以使用竞争消费者模式将消息传递给其他消费者。 但是副作用是消息顺序丢失了,因为消息将被放置在消息队列的尾部。 同样,使用调度程序运行代理也会对性能产生一些影响。 这种重试机制对于长时间的重试很有用,因为您无法承受每个失败消息的阻塞线程。 当您希望保留消息并对其进行聚类以进行重新交付时,它也很有用。

请注意,与使用代理重新交付插件相比,手动实现代理重新交付逻辑很容易。 您所要做的就是捕获异常并发送带有
AMQ_SCHEDULED_DELAY标头指向中间队列。 一旦延迟过去,该消息将被使用,并且将重试相同的操作。 您可以多次重新计划和处理同一条消息,直到放弃并将消息放入退避或死信队列中。

翻译自: https://www.javacodegeeks.com/2017/06/short-retry-vs-long-retry-apache-camel-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现驾校考试系统_jsp驾校考试系统

本驾校考试系统采用了Browser/Server体系结构,JSP(Java Server Page)作为前台开发工具,MySQL作为后台数据库进行开发。最终系统实现的系统将分为管理员和学员两个角色,其中系统管理员部分的主要功能包括修改登录密码、学员信息管理、科目1题目…

java qlv转mp4 代码_怎么将qlv格式转换成mp4?教你快速转换视频格式的技巧

如何将qlv格式转换成mp4?众所周知qlv格式是腾讯视频的下载格式,而qlv格式的特点在于不能用别的播放器打开。如果用腾讯视频以外的播放器打开则需要将qlv格式转换成mp4,那你知道将qlv格式转换成mp4的技巧吗?下面小编教你一种转换qlv格式的技巧…

mysql导入竖杠分割的数据_MYSQL :逗号分隔串表,分解成竖表

DROP TEMPORARY TABLE IF EXISTS Temp_Num ;CREATE TEMPORARY TABLE Temp_Num ( xh INT PRIMARY KEY ); -- 创建数字辅助表SET i 0;INSERT INTO Temp_Num(xh) -- 写入数字辅助表SELECT i : i1FROM AdDataCenter.Ad_Targeting_Mobisage aLIMIT 0, 100 ;SELECT b.AdGroupID , SU…

浙大JAVA实验题12_2019浙大计算机考研机试模拟赛(2)——概念专题

题目链接 引用自晴神OJA - 边覆盖B - 极大独立集C - 稳定婚姻问题D - 笛卡尔树没赶得上全程的比赛,就做了两道,后面两道以后有时间再补。两道都是概念题,比较基础~ 以下是题解A - 边覆盖Case Time Limit: 200 MS (Others) / 400 MS (Java) …

hadoop小型集群_小型Hadoop集群的Ganglia配置和一些故障排除

hadoop小型集群Ganglia是一个针对大型集群的开源,可扩展且分布式的监视系统。 它收集,汇总并提供数十种与计算机相关的指标(例如CPU,内存,存储,网络使用情况)的时序视图。 您可以在UC Berkeley …

spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建

spring aop组件以下文章将显示在我参与的一个项目中,我们如何使用Spring的AOP来介绍一些与安全性相关的功能。 这样的概念是,为了使用户能够看到某些UI组件,他需要具有一定级别的安全特权。 如果不满足该要求,则不会显示UICompone…

使用Spring Boot构建RESTFul服务

每个人都在谈论微服务,例如WSO2微服务框架 , Spring Boot等。由于我已经很长时间没有从事任何与Spring相关的项目了,所以我想到了使用Spring Boot实现一个简单的RESTFul服务。 因此,我从Spring文档开始。 这很简单。 您可以使用“…

将Swagger与Spring Boot REST API集成

在上一篇文章中,我谈到了我使用Spring Boot创建RESTFul Services的经验。 在创建REST API时,正确的文档是其中的必需部分。 昂首阔步是什么? Swagger (Swagger 2)是用于描述和记录REST API的规范。 它指定了REST Web…

php滴滴平台接口,图片服务API文档

简介滴滴云图片服务API提供标准的轻量级无状态HTTP接口,支持用户对数据的全方位管理。接口概览API描述图片信息获取文件的基本信息,包括长度、宽度、文件大小、格式。图片旋转将图片按顺时针旋转。图片模糊对图片进行模糊操作。图片缩放将图片缩小或者放…

java遇上html,JAVA遇见HTML——JSP篇:JSP内置对象(上)

JSP九大内置对象JSP内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象。int[] value{60,70,80};for(int i:value){out.println(i);}%>Web程序的请求响应模式用户发送请求(request)服务器给用户响应(response)out对象:out对象是JspW…

java中接口文件创建_功能接口简介–在Java 8中重新创建的概念

java中接口文件创建世界各地的所有Java开发人员都将至少使用以下接口之一:java.lang.Runnable,java.awt.event.ActionListener,java.util.Comparator,java.util.concurrent.Callable。 声明的接口之间有一些共同的特征&#xff0c…

Java命令行界面(第12部分):CLAJR

第十二篇有关在Java中处理命令行参数的文章的特色库是带有Java Reflection的命令行参数 (CLAJR)。 该“库”是单个Java源文件( CLAJR-0.9.java ), 可从SourceForge下载 。 CLAJR的主页当前显示2006年版权日期&#xff…

specs.4.8.gz_使用Specs2和客户端API 2.0进行富有表现力的JAX-RS集成测试

specs.4.8.gz毫无疑问, JAX-RS是一项杰出的技术。 即将发布的规范JAX-RS 2.0带来了更多的强大功能,尤其是在客户端API方面。 今天的帖子的主题是JAX-RS服务的集成测试。 有很多优秀的测试框架,例如REST,可以确保提供帮助&#xff…

了解OAuth2令牌认证

1.简介 在本教程中,我们将了解OAuth2令牌身份验证 ,以便只有经过身份验证的用户和应用程序才能获得有效的访问令牌,该令牌随后可用于访问服务器上的授权API(在OAuth术语中仅是受保护的资源)。 使用基于令牌的身份验证…

Java 9:好的,坏的和私有的接口方法

Java 9 是在几周前发布的。 查看发行说明 ,其中包含许多有趣的功能。 不过,我觉得并非一切都是不如甲骨文和Java行家似乎图片吧 。 我看到了Java世界中的三个趋势,分别是好,坏和丑陋。 让我们从好的开始。 Birdman(20…

PagingAndSortingRepository –如何与Thymeleaf一起使用

在本教程中&#xff0c;我将演示如何通过分页显示Thymeleaf中的企业客户列表。 1 –项目结构 我们有一个正常的Maven项目结构。 2 –项目依赖性 除了正常的Spring依赖关系之外&#xff0c;我们还添加Thymeleaf和hsqldb&#xff0c;因为我们使用的是嵌入式数据库。 <?x…

matlab里方差分析的盒子图怎么看,Matlab方差分析

Matlab 方差分析(T检验)在工农业生产和科学研究中,经常遇到这样的问题:影响产品产量、质量的因素很多,我们需要了解在这众多的因素中,哪些因素对影响产品产量、质量有显著影响.为此,要先做试验,然后对测试的结果进行分析.方差分析就是分析测试结果的一种方法.在方差分析中,把在…

使用Okta的单点登录保护您的Vert.x服务器

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Vert.x是Spring生态系统中增长最快的元素之一&#xff0c;保护Vert.x服务器可能是一个…

Apache Kafka简介

什么是Apache Kafka&#xff1f; Apache Kafka是一个分布式流系统&#xff0c;具有发布和订阅记录流的功能。 在另一方面&#xff0c;它是企业消息传递系统。 它是一个快速&#xff0c;水平可扩展和容错的系统。 Kafka有四个核心API&#xff0c; 生产者API&#xff1a; 该API允…

oracle查看存储过程最近编译,Oracle恢复被误编译覆盖的存储过程

同事在写Oracle存储过程时候&#xff0c;是在以前已经写好的过程基础上修改的&#xff0c;想换个名字&#xff0c;由于疏忽没有改名字就编译了&#xff0c;编译完才意识到。这时原来的那个已经没有了。找我想办法恢复回原来的那个过程。通过查资料想到个方法&#xff0c;也不知…