Hi,

> On 29 Oct 2021, at 15:42, Esteban Maringolo <emaring...@gmail.com> wrote:
> 
> Hi,
> 
> I happened to me more than once that I have to create some REST service 
> "client" in which I usually wrap an HTTP client inside (ZnClient in this 
> case), and all the calls to the service, end up using the HTTP client, inside 
> some mutex to serialize the execution.

Yes, that is a good design. However, whether your REST client object wrapping a 
ZnClient is used by multiple concurrent threads is another decision. I would 
personally not do that. See further.

> But I don't like that, in particular when some endpoints are better with 
> streaming responses (large downloads) and I have to fiddle with the client 
> and set it back to the settings before executing the request.

You only can and should reuse connections to the same endpoint/service only, 
doing similar types of request/responses (let's say simple ones).

A definitive danger point is authentication and authorization: different calls 
by different users might need different REST call settings, each time. Also, 
caching can be a problem, if user A can see / sees the cache of user B.

> So, long story short... is it always safer to instantiate a new ZnClient on a 
> per request basis since no state is shared, but I guess it is also less 
> effective if I'm performing several requests to the same server.

A new instance is definitely safer because it is cleaner. Reusing a connection 
is more efficient when doing multiple calls in (quick) succession. The penalty 
is usually pretty low, you can postpone optimising until there is an actual 
problem.

Error handling and recovery are also harder in the reuse case (what state is 
the connection in ?).

ZnClient does a form of automatic reconnection/retry though.

> What are the recommended approaches here?
> 
> 
> Esteban A. Maringolo

HTH,

Sven

Reply via email to