Sentinel Circuit breaking was not triggered with Spring WebFlux and reactive WebClient

9rygscc1  于 2021-11-29  发布在  Java
关注(0)|答案(20)|浏览(349)

Issue Description

Type: bug report or feature request

Describe what happened (or what feature you want)

SphU.asyncEntry 接口无法block

Describe what you expected to happen

我写了个服务接口,delay 1秒

使用如下的方法测试,资源设置50ms超时,时间窗口2秒

日志显示
没有请求block,所有请求都成功到达后端

How to reproduce it (as minimally and precisely as possible)

  1. 写一个缓慢的服务端,我采用delay 1秒模拟
  2. 使用webflux webclient 请求服务,订阅里close AsyncEntry
  3. 循环调用多次,我测试是调用100次

Tell us your environment

jdk 14, kotlin 1.3.71, win 10 64 bit

Anything else we need to know?

vqlkdk9b

vqlkdk9b1#

你接口的延时时间太长了,你试试60ms,并且你每个请求间sleep 5ms 试试。

ruoxqz4g

ruoxqz4g2#

1秒的接口延时应该还算合理,我在调用处加了sleep依然没有block住

bn31dyow

bn31dyow3#

参考文档看看是否满足触发条件:https://github.com/alibaba/Sentinel/wiki/熔断降级
1.8.0 版本会对 RT 模式进行改进

tvz2xvvm

tvz2xvvm4#

我觉得使用thread local的方式有问题,使用协程,多个方法可能走到同一个线程

q5iwbnjs

q5iwbnjs5#

同样配置异步的不触发熔断,所有请求都会发送到后端,同步请求触发熔断,所以应该不是配置的问题,我的配置如下
resource: zlw-get-user-pig-factory-list-api
count: 100.0
timeWindow: 2

a64a0gku

a64a0gku6#

kotlin和reactor都有一套context,spring 通过判断类型来决定使用同步的thread local或者使用异步的XXXContext
https://spring.io/blog/2019/05/16/reactive-transactions-with-spring

bjg7j2ky

bjg7j2ky7#

可以先提供一个版本的么,同步的或异步的都行,可以手工传入context
目前同步可以熔断,但是因为协程thread local出问题,导致一直狂刷错误日志
异步目前根本不能熔断

gev0vcfq

gev0vcfq8#

有什么问题 错误 具体描述下。

von4xj4u

von4xj4u9#

目前使用kotlin协程,同步方法一直报错

7fyelxc5

7fyelxc510#

异步版本的上面有描述,不会触发

bmp9r5qi

bmp9r5qi11#

可否给个 demo 工程,社区来复现下

jv2fixgn

jv2fixgn12#

好的,我等下把项目地址写在下面

quhf5bfb

quhf5bfb14#

测试前先把web跑起来,bootRun
然后执行测试,一共写了5个测试,每个测试熔断策略都一致,分别跑500次
测试1,2使用sentinel同步api
测试3,4,5使用异步api

测试 1调用了三个接口,2个接口使用withContext异步调用,一个接口异步调用,出现少量熔断,大部分请求都通过,出现部分下列错误

z4bn682m

z4bn682m15#

测试2 删除了第三个请求,二个请求在withContext里异步执行, 绝大多数请求都被熔断了

相关问题