Forwarding this along, since it's not making it to the list for some reason.

---------- Forwarded message ---------
From: xzer <[email protected]>
Date: 2020/6/17/ 10:59PM
Subject: About HttpAsyncClient exception handling mechanism
To: <[email protected]>


Hello,

I am writing this mail to pursue the possible improvement on the current
HttpAsyncClient exception handling mechanism.

We observed many service failures inside our company with the error of “I/O
reactor status: STOPPED” when using Apache HttpAsyncClient, we also know
the reason is because the IOReactorExceptionHandler is not set correctly.

For reference:
https://hc.apache.org/httpcomponents-core-ga/httpcore-nio/apidocs/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.html

We noticed that there are several things should be taken into consideration
as this kind of "mistake" keeps happening:

- There is almost no guidance information about IOReactorExceptionHandler
at the official site except a small paragraph in tutorial. The official
example of how to customize and configure the client building does not have
IOReactorExceptionHandler configured too.

- The example of quick start is using "HttpAsyncClients.createDefault()" to
illustrate the out-of-box usage, but the client instance created by which
"quick way" does not have IOReactorExceptionHandler configured too.

- Even we configure the IOReactorExceptionHandler to handle the Exceptions,
we still have several concerns:
  - Is that safe to resume the IO Reactor unconditionally on any Exception?
  - It is still impossible to recover the IO Reactor if there is an Error
rather than Exception, which is typically happening when the service is
under traffic pressure.

For the final point of Exception/Error recovery, we understand that it is
difficult to decide how to handle the Exception/Error at library level as
we have less knowledge about the runtime context. However, it is a painful
task to developers who have to take the robustness into account. We believe
that HttpAsyncClient should provide extra robustness mechanism to simplify
the usage.

We have a proposal like following:

- The client instance created by "HttpAsyncClients.createDefault()" should
have a default IOReactorExceptionHandler configured.

- The guidance information of setting IOReactorExceptionHandler should be
added into the example of customizing.

- We also propose a default strategy of Exception handling as: resume on
RuntimeException and crash on IOException, which is based on a hypothesis
that RuntimeException is usually caused by user code and IOException is
more likely suggesting a underlying network communication failure.

- We also propose a mechanism which will check the IOReactor status and
then reinitialize the client instance entirely when uncaught
Exception/Error happens.

As the proposal still requires polish and discussion, thus we are sending
this mail to ask the opinion from you about it.

Best Regards
Rui Liu
Sr SDE | Amazon IN Core CX Tech

Reply via email to