-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
集群间数据不一致,日志中持续的抛出 Request cannot be executed; I/O reactor status: STOPPED #6367
Comments
从提供的日志上看,集群之间数据同步是有问题的,各台Nacos server之间间歇性地互相访问不通。检查一下网络? |
|
这个问题存在很长时间了,很多地方集群建的通信或者自身的调用貌似都用到了这个NacosAsyncRestTemplate,但是它里面的HttpClient有可能会意外关闭,目前的逻辑不会自动恢复或者重新创建 // CloseableHttpAsyncClientBase.java
public CloseableHttpAsyncClientBase(
final NHttpClientConnectionManager connmgr,
final ThreadFactory threadFactory,
final NHttpClientEventHandler handler) {
super();
this.connmgr = connmgr;
if (threadFactory != null && handler != null) {
this.reactorThread = threadFactory.newThread(new Runnable() {
@Override
public void run() {
try {
final IOEventDispatch ioEventDispatch = new InternalIODispatch(handler);
connmgr.execute(ioEventDispatch);
} catch (final Exception ex) {
log.error("I/O reactor terminated abnormally", ex);
} finally {
// reactor意外挂了,就会直接变成stopped
status.set(Status.STOPPED);
}
}
});
} else {
this.reactorThread = null;
}
this.status = new AtomicReference<Status>(Status.INACTIVE);
} |
|
个人觉得,如果是意外关闭导致的IO异常,异常信息还是打印出来比较好。异步调用失败,NacosAsyncRestTemplate都会调用callback.onFail或者onException,nacos会对应处理。 如果判读一下isRunning,start 最多只是把日志内容换一下,但是持续出现对应日志依旧。 最后如果判断线程或链接已关闭就自己去启动线程是绝对不可取的操作。可能会导致极其严重的内存/连接泄漏问题。 |
这个异常是请求发送之前抛出的异常,还没有走到回调的逻辑,所以不会触发onFail() 。 NacosAsyncRestTemplate 这个类使用的时候都是以单例模式来用的,一旦异步线程意外关闭,项目中所有使用 NacosAsyncRestTemplate 发送的请求都发送不出去了,这样的话可能就会使集群处在异常状态了,并产生了错误的行为(例如数据不一致,将请求转发到失效的实例上等问题)。 针对这种问题是否可以做一些其他的补救措施呢,因为目前的话,如果出现了这种情况,就只能重启问题节点。 |
异步线程是httpclient中的实现,使用的时候好像不好判断,得看一下CloseableHttpAsyncClient是否有提供对应的机制。 我理解httpclient只要不关闭Client,下一次请求会重新补充连接。 |
异步线程是httpclient中的实现,但是具体的线程启动逻辑是在 我也认为只要没有关闭Client,如果线程挂了,应该需要主动处理一下,而不只是打印异常信息。 |
elastic/elasticsearch#49124 也遇到类似的问题,看样子应该是IOReactor意外退出导致的异常。我跟了一下源码,关键逻辑主要在org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor#execute。我们可以增加自定义的org.apache.http.nio.reactor.IOReactorExceptionHandler 来捕捉RuntimeException尝试修复这个问题。 |
👍🏻,你要是有时间,可以试着改一下这里,目前我这边事情比较多,有点搞不过来😁。提供一下我的思路:可以增加一个IOReactorExceptionHandler,然后在异常的时候,把旧的ayncClient shutdown掉,然后在重新创建一个新的asyncClient。 |
可以,我尝试修复一下这个问题。 |
@yuzhaopeng 你好,可以发一下你的日志中有对应的 |
我搜索了现存的日志文件,没有找到 |
… loop when meet unknown Network error. (#6441) * Add IOExceptionHandler to handle the Exception form IOReactor. * remove the systemProperties for create ConnectionManager. * fix the javadoc.
hi @KomachiSion 1.4.x这个bug请一并修复一下吧 |
2.0.4版本依旧存在问题
集群节点数据不一致 |
Describe the bug
Expected behavior
Acutally behavior
How to Reproduce
Desktop (please complete the following information):
Additional context
naming-server.log 日志中,异常堆栈如下:
The text was updated successfully, but these errors were encountered: