设置 Hystrix 的请求上下文与在 Vert.X 中运行的 RxJava 崩溃

Posted

技术标签:

【中文标题】设置 Hystrix 的请求上下文与在 Vert.X 中运行的 RxJava 崩溃【英文标题】:Setting request context for Hystrix collapsing with RxJava running in Vert.X 【发布时间】:2018-07-29 02:16:04 【问题描述】:

我想使用 Hystrix (1.5.12) 与在 Vert.X (3.3.3) 中运行的 RxJava (1.3.3) 折叠。我遇到的问题是没有为请求缓存键的线程设置 Hystrix 请求上下文。

当请求进来时,我创建一个 Hystrix 请求上下文,并将这个上下文作为参数传递给所有创建 observables 的类。

创建HystrixObservableCollapser 实现并在创建的折叠器上调用toObservable() 的类在某个Vert.X 事件循环线程上被调用。

上面返回的 observable 上的订阅可能在也可能不在折叠器创建线程上。这个订阅线程不同于请求进来并创建 Hystrix 请求上下文的线程。所以没有为订阅线程设置 Hystrix 请求上下文。

我已经阅读了HystrixRequestContext in case of async requests 和其他问题,并且我已经尝试了许多 RxJava 和 Hystrix 钩子,但它们似乎都不起作用:

RxJavaHooks#setOnScheduleAction HystrixConcurrencyStrategy#wrapCallable 使用 HystrixContextScheduler 将 RxJava 调度程序包装在 RxJavaHooks#setOnComputationScheduler(和其他 2 个调度程序挂钩)中。

当我在传递给折叠器返回的可观察对象的doOnSubscribe(...) 的 lambda 中设置 Hystrix 请求上下文时,以下钩子确实开始起作用了:

RxJavaHooks#setOnScheduleAction 将 RxJava 调度程序包装在 RxJavaHooks#setOnComputationScheduler(以及其他 2 个调度程序挂钩)中。

是否在collapser返回的observable的doOnSubscribe(...)中为当前线程设置Hystrix请求上下文,并使用上面2个钩子中的1个,设置Hystrix请求上下文的正确方法?

如果是这样,哪个钩子是首选方法?

如果不是,如何正确确保为线程设置了Hystrix请求上下文?

【问题讨论】:

【参考方案1】:

我没有将此标记为答案,因为我不能 100% 确定这是正确的方法。但这对我有用。

我正在使用 RxJava 调度程序挂钩,并结合折叠器返回的 observables 上的 doOnSubscribe(...)

【讨论】:

以上是关于设置 Hystrix 的请求上下文与在 Vert.X 中运行的 RxJava 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud(Dalston.SR5)--Hystrix 断路器-缓存

深入浅出SpringCloud原理及实战「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的缓存请求执行运作原理

如何使用 Spring Cloud 将 Hystrix 属性设置为 Feign 请求?

使用 Netflix Feign 和 Hystrix 设置请求超时

Vert.x-Web的讲解和使用

Vert.x-Web的讲解和使用