首页
学习
活动
专区
圈层
工具
发布

项目实战:第三方接口调用,超时失败时的重试方案

在实际工作过程中,重试是一个经常使用的手段。...比如工程中使用http请求外部服务,可能因为网络异常出现超时而采取重试手段,查阅了N多资料,也未发现有成型的框架可以支持失败重试策略,幸运的是还是有成型的中间件中关注过此问题的。...从Spring Batch 2.2.0开始,重试功能作为一个新的项目Spring Retry单独维护,在spring官网上并没有此独立的项目存在,项目源码地址:https://github.com/spring-projects...,最多重试5次,每次在上一次的基础上延后1秒,multiplier为乘系数。...若5次重试后依旧失败,则默认调用带有注解@Recover的方法,给接口返回一个默认值。

2K10

Angular快速学习笔记(4) -- Observable与RxJS

基本用法和词汇 作为发布者,你创建一个 Observable 的实例,其中定义了一个订阅者(subscriber)函数。 当有消费者调用 subscribe() 方法时,这个函数就会执行。...subscribe() 调用会返回一个 Subscription 对象,该对象具有一个 unsubscribe() 方法。 当调用该方法时,你就会停止接收通知。...为什么NG使用observable而不是Promise? 可观察对象不会修改服务器的响应(和在承诺上串联起来的 .then() 调用一样)。...当发出新值时,该管道就会把这个组件标记为需要进行变更检查的(因此可能导致刷新界面) @Component({ selector: 'async-observable-pipe', template...有一些关键的不同点: 可观察对象是声明式的,在被订阅之前,它不会开始执行,promise是在创建时就立即执行的 可观察对象能提供多个值,promise只提供一个,这让可观察对象可用于随着时间的推移获取多个值

7.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    RxJS 快速入门

    传统写法下,当我们调用一个 Ajax 时,就要给它一个回调函数,这样当 Ajax 完成时,就会调用它。当逻辑简单的时候,这毫无问题。但是我要串起 10 个 Ajax 请求时该怎么办呢?十重嵌套吗?恩?...竖线表示这个流正常终止了,也就是说不会再有更多的数据提供出来了。而叉号表示这个流抛出错误导致异常中止了。还有一种流,既没有竖线也没有叉号,这种叫做无尽流,比如一个由所有自然数组成的流就不会主动终止。...这个回调函数可能被调用很多次,取决于这个流中有多少条数据。 注意,Observable 必须被 subscribe 之后才会开始生产数据。如果没人 subscribe 它,那就什么都不会做。...retry 操作符就是负责在失败时自动发起重试的,它可以接受一个参数,用来指定最大重试次数。 这里我为什么一直在强调失败时重试呢?因为还有一个操作符负责成功时重试。 repeat - 成功时重试 ?...坑与最佳实践 取消订阅 subscribe 之后,你的回调函数就被别人引用了,因此如果不撤销对这个回调函数的引用,那么与它相关的内存就永远不会释放,同时,它仍然会在流中有数据过来时被调用,可能会导致奇怪的

    2.6K20

    All RxJava - 为Retrofit添加重试

    一个合理的重试策略应该是:遇到网络异常时应该等待一段时间后再重试,若遇到的异常次数越多,等待(退避)的时间就应该越长。...需要注意的是,千万不要使用这两个操作符无限地重订阅源Observable,一定要在恰当的时候通过取消订阅的方式来停止它们,避免陷入无限循环,从而导致系统崩溃。...回到本篇文章的主题上,我们需要的是在遭遇I/O异常时,发起重试,而不是请求成功时,很明显的.retry()胜出! Retry?RetryWhen!...我们的重点是,只有遭遇了IOException时才重试网络请求,也就是说那些IllegalStateException,NullPointerException或者当你使用gson来解析json时还可能出现的...>,通配符(泛型)表示我们可以返回任意类型的Observable,它的作用是:一旦这个Observable通过onNext()发送事件,则重订阅(重试)发生一次,如果这个Observable调用了onComplete

    1.9K10

    RxJava2 实战知识梳理(6) - 基于错误类型的重试请求

    :http://www.jianshu.com/p/d135f19e045c 声明:本文是泽毛原创,已获其授权发布,未经原作者允许请勿转载 一、前言 1.1 应用背景 在网络请求时,...1.2 示例代码 在下面的例子中,我们一共发起了五次请求,也就是subscribe中的代码,其中前四次请求都调用onError方法通知下游请求失败,同时带上了自定义的错误信息wait_short...如果需要重试,那么通过Timer操作符延时指定的时间,否则返回Observable.error(Throwable)放弃重试。...对于每一次订阅的数据流 Function 函数只会回调一次,并且是在onError(Throwable throwable)的时候触发,它不会收到任何的onNext事件。...在Function函数中,必须对输入的 Observable进行处理,这里我们使用的是flatMap操作符接收上游的数据,对于flatMap的解释,大家可以参考 RxJava2 实战知识梳理

    1.7K10

    Carson带你学Android:RxJava功能性操作符

    作用 辅助被观察者(Observable) 在发送事件时实现一些功能性需求 如错误处理、线程调度等等 2....// 从而实现被观察者调用了观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式 // 同时也看出:Observable只是生产事件,真正的发送事件是在它被订阅的时候,即当 subscribe...需求场景 在事件发送 & 接收的整个生命周期过程中进行操作 如发送事件前的初始化、发送事件后的回调请求等 对应操作符使用 do() 作用 在某个事件的生命周期中调用 类型 do()操作符有很多个...若新被观察者(Observable)返回1个Complete / Error事件,则不重新订阅 & 发送原来的 Observable 若新被观察者(Observable)返回其余事件时,则重新订阅 &...(); // Observable.empty() = 发送Complete事件,但不会回调观察者的onComplete()

    1.2K10

    Android RxJava操作符详解 系列:功能性操作符

    作用 辅助被观察者(Observable) 在发送事件时实现一些功能性需求 如错误处理、线程调度等等 ---- 2. 类型 RxJava 2 中,常见的功能性操作符 主要有: ?...3.4 在事件的生命周期中操作 需求场景 在事件发送 & 接收的整个生命周期过程中进行操作 如发送事件前的初始化、发送事件后的回调请求等 对应操作符使用 do() 作用 在某个事件的生命周期中调用...retry() 作用 重试,即当出现错误时,让被观察者(Observable)重新发射数据 接收到 onError()时,重新订阅 & 发送事件 Throwable 和 Exception都可拦截...则不重新订阅 & 发送原来的 Observable 若新被观察者(Observable)返回其余事件时,则重新订阅 & 发送原来的 Observable 具体使用 Observable.just(1,2,4...(); // Observable.empty() = 发送Complete事件,但不会回调观察者的onComplete()

    1.4K10

    程序员都应该懂的微服务容错与隔离:熔断保护、超时与重试原理

    当外部电压过高,达到保险丝的熔点时,保险丝就会被熔断,从而可以切断家电系统与外部电路的联通,进而保障家电系统不会因为电压过高而损坏。...Hystrix提供的熔断器就有类似功能,在一定时间内调用的服务次数达到设定的阈值,并且出错的次数也达到设置的出错阈值时,就会进行服务熔断,让服务调用方执行本地设置的降级策略。...在实际开发中,有太多的故障是没有设置超时时间导致的服务“Hang住”或者OOM异常,或者是超时时间设置不合理导致的资源无法回收问题,最终导致系统崩溃。...● 前端Ajax超时:浏览器通过Ajax访问网络时的网络连接和读写超时时间。 重试机制 重试是伴随着超时的,常见于因网络不稳定导致的服务调用超时场景。...在允许重试的场景中,我们需要保证服务提供方能够实现业务逻辑的幂等,因为重试机制可能导致服务提供方被多次调用。幂等设计需要解决的是“写重试”的问题。

    96120

    响应式编程在前端领域的应用

    HTTP 请求与重试基于响应式编程,我们可以很简单地实现一个请求的获取和自动重试:import { ajax } from "rxjs/ajax";import { map, retry, catchError...} from "rxjs/operators";const apiData = ajax("/api/data").pipe( // 可以在 catchError 之前使用 retry 操作符。...这两个其实很不一样:Promise 会发生状态扭转,状态扭转不可逆;而 Observable 是无状态的,数据流可以源源不断,可用于随着时间的推移获取多个值Promise 在定义时就会被执行;而 Observable...虽然服务按照功能结构进行拆分了,但依然会存在服务间调用导致依赖关系复杂、事件触发和监听满天飞等情况,这种情况下,只能通过全局搜索关键字来找到上下游数据流、信息流,通过一个接一个的节点和关键字搜索才能大概理清楚某个数据来源哪里...timer也就是说,如果我们界面中有个倒计时,就可以以定时器为数据源,订阅该数据流进行响应:// timerOne 在 0 秒时发出第一个值,然后每 1 秒发送一次const timerOne = timer

    1.2K80

    架构原理|服务雪崩效应现象以及处理方法之Hystrix实现

    服务雪崩效应的定义 服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示: ?...而形成 重试加大流量 的原因有: 用户重试 代码逻辑重试 在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单. 服务调用端的会存在大量服务异常后的重试逻辑....这些重试都会进一步加大请求流量. 最后, 服务调用者不可用 产生的主要原因是: 同步等待造成的资源耗尽 当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源....强依赖服务不可用会导致当前业务中止,而弱依赖服务的不可用不会导致当前业务的中止. 不可用服务的调用快速失败一般通过 超时机制, 熔断器 和熔断后的 降级方法 来实现....当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过. 熔断器的开关能保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待.

    1.9K20

    Rxjs 响应式编程-第二章:序列的深入研究

    我发现该游戏与使用Observable序列有很多相似之处。 Observable只是我们可以转换,组合和查询的事件流。 无论我们是在处理简单的Ajax回调还是在Node.js中处理字节数据都没关系。...问题是如果序列永远不会结束,像reduce这样的聚合运算符将永远不会调用其Observers的onNext运算符。...相反,当我们订阅Observable时,我们会得到一个代表该特定订阅的Disposable对象。然后我们可以在该对象中调用方法dispose,并且该订阅将停止从Observable接收通知。...默认行为是,每当发生错误时,Observable都会停止发出项目,并且不会调用onCompleted。...其次,重试将始终重新尝试整个Observable序列,即使某些项目没有错误。如果您在处理项目时造成任何副作用,这一点很重要,因为每次重试都会重新应用它们。

    5.4K20
    领券