-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replace sync request with async request in DistroFilter #10148
Comments
DistroFilter是用于适配1.x客户端的的一个转发器, 未来最终会被移除(在不需要支持1.x客户端时) 改为异步会存在几个问题:
目前想到这两方面的问题。 |
@KomachiSion 异步的话不会导致数据不一致啊,我是说结合async servlet,异步请求target server,然后等结果返回后返回给客户端,而不占用当前server的tomcat线程,但是现在的问题是比较严重的,一个节点出现问题影响整个集群可用性。 至于导致更大的压力这个就是另外一件事情了啊,也应该依靠这里的同步请求来来解决的,比如可以限流等。 |
"http-nio-8848-exec-200" #525 daemon prio=5 os_prio=0 tid=0x00007ff578177000 nid=0x266 waiting on condition [0x00007ff4c30f5000] |
@KomachiSion 能帮我review一下 这个pr吗?#10158 |
PR先不急, 第一个问题异步的话会出现。 |
@KomachiSion 不会啊,我用的是async servlet,只是不block tomcat的请求线程,我还是会等到“责任”节点返回后再返回给客户端啊,不会出现客户端成功但实际失败的情况啊 |
我是这么觉得,我想的其实是DistroFilter的转发不要占用当前节点的tomcat线程,因为一旦占用其实就是节点之间相互影响了,那么其实比较好的办法就是将这个转发改成异步,但这个异步改造并不是说DistroFilter里将转发请求发出去就ok了,是会利用async servlet的特性,等着对应负责的节点返回后将结果返回给客户端,所以不会带来 @KomachiSion 所说的,给客户端返回心跳成功,实际失败的情况,我用伪代码描述一下: 这是同步的方式
异步的方式
另外,对于问题2,我觉得也是不存在的,我们不能以集群的可用性为代价来保护一个本来就慢了的节点呀。 关于升级客户端到2.x 另外,我其实认为DistroFilter这种转发是有一定的道理的,这样可以在某种程度获得一定的实时性保证。因为在正常的时候,所有的请求都是由负责的节点处理,得到的数据是最一致和新鲜的。 谢谢 |
同步转异步,客户端到服务端A的请求需要被直接返回,应该只能返回成功吧? 但是异步请求到服务端B可能失败, 这样客户端认为成功了, 但是失败了, 这样就不会补偿了, 数据就出问题了。 |
@KomachiSion 不会 |
这个方式的话,看起来是可行的,但是要做好response的管理,避免连接和内存泄漏。 可以添加一个开关,在异步有问题的时候能够回滚到同步恢复。默认值维持同步。 |
@yuyijq @KomachiSion 嗯 我觉得可以的,可以先用默认同步的,增加个动态配置能开启异步,后边逐步默认过渡到异步。长远上,其实也可以考虑从客户端开始异步化,这部分可以一起在Nacos 3.x可以考虑一下。 |
@xuechaos 好的,我加个开关~~ |
@xuechaos @KomachiSion |
* Replace sync forward request with async request in DistroFilter. issue #10148 * extract method for config default headers * add env switch for async distro forward. * Fixed code review problems: 1. Move async forward switch from sys module to naming module. 2. use nacos code style to format code. * Fixed nacos code checkstyle: 1. one import per Class 2. add javadoc * In order to avoid additional overhead, move switch from GlobalConfig to ClientConfig and cache the env switch. * Move switch from ClientConfig to DistroConfig. * Removed unused import. * Add test for async forward for DistroFilter * Add license * rename test method name * Should enable async forward * fixed test * set async forward request switch to true in test * fixed test: create and set property with MockEnvironment * fixed check style * move MockEnvironment init to BeforeClass * add setter for asyncForwardRequest switch
@yuyijq
I merged the PR but I found these new dependencies and do revert first. Why add these new dependencies? Can you use mock RestTemplate for instead? |
Using a synchronous approach to forward requests to other servers in DistroFilter can block Tomcat's processing thread when other servers respond very slowly. This can easily fill up Tomcat's thread pool and render the entire cluster unusable in case of failures. Is it possible to change this to an asynchronous request?
在DistroFilter里使用同步的方式转发请求给其他server,如果其他server响应非常缓慢的时候,这将会block tomcat的处理线程,当出现故障的时候,很容易将tomcat的线程池打满,导致整个集群不可用。
这个地方能改成异步请求吗?
The text was updated successfully, but these errors were encountered: