> Am 14.05.2019 um 09:30 schrieb Ruediger Pluem <[email protected]>:
> 
> 
> 
> On 05/13/2019 03:30 PM, Stefan Eissing wrote:
>> 
>> 
>>> Am 13.05.2019 um 14:42 schrieb Plüm, Rüdiger, Vodafone Group 
>>> <[email protected]>:
>>> 
>>> I recently started using mod_proxy_http2 and some questions popped up for 
>>> me:
>>> 
>>> 1. Why do we retry 5 times hardcoded (leading to AH10023 in case we fail)?
>>>  The other protocols only try to retry once if the ping failed (additional 
>>> Expect 100 header in the HTTP case, PING packet in the AJP case).
>> 
>> I think that is buried in history. I cannot think of a good reason for it.
> 
> Thanks for confirmation. For trunk my immediate idea would be to change '5' 
> to '2' and thus be somewhat in line with the
> other schemas. But I guess this is not possible for 2.4.x due to 
> compatibility concerns. I guess we need to make it
> configurable there with a default of 5. Opinions?

mod_proxy_http2 is still experimental. Feel free to change anything that 
improves in your setup!

>> 
>>> 2. Could we try to leverage the ping configuration parameter for workers 
>>> used by HTTP / AJP by sending a PING frame on the HTTP/2 backend
>>>  connection and wait for the reply for the configured seconds in ping, 
>>> retry once if failed with a new connection and return 503 if failed again
>>>  or continue processing if things were fine?
>> 
>> Is that something the module can provide directly or is this for the 
>> proxy/balancer infrastructure?
> 
> This is something the module provides. It just needs to reply with a 503 if 
> the worker is seen as faulty. This causes
> a possibly configured loadbalancer that has this worker as member to fail 
> over to a different member.
> 
> I understand the modules current behavior as follows:
> 
> 1. If the TCP connection is reused and no frame was received within the last 
> second a PING frame is added before
>   the stream for the request is set up.
> 2. The request body if any is not sent until the PING reply has arrived.
> 3. If the ping does not arrive reply with 503.

Yes, that was my intention. I added it to prevent a race with a GOAWAY frame 
from the backend (e.g. its keepalive timed out).

> The issue I see with the above is:
> 
> 1. Once the request is sent only idempotent requests could be sent to another 
> worker in case we have a loadbalancer
>   setup. Once a non idempotent request is sent we cannot be sure if it was 
> not processed somehow by the backend.
> 2. Even if for new connections a TCP connection can be established it is not 
> clear if the backend is ready to process it
>   due to things like backlogs, deferred accept setups or separate accept 
> threads. Using a different short ping
>   timeout removes these uncertainties. With regards to the ping overhead this 
> should only be done if the admin
>   configured the ping and hence is aware of the additional overhead with 
> respect to traffic and latency.
> 
> A similar behavior to the other modules would be
> 
> 1. Sent the PING frame no matter if it is a new or existing connection in 
> case the ping option is configured on
>   the worker.
> 2. Wait for the time configured in the ping option for the PING reply to 
> arrive. If it does not arrive reply with a 503,
>   if it does continue with the request.

I agree to your observation in regard to idempotency. Holding back the body 
alone is not enough. Always sending a PING simplifies things, although for a 
new connection, the arrival of the remote SETTINGS frames should be indiction 
enough that the HTTP/2 is sound. But since latency to backend usually is low, 
this may not be an issue.

- Stefan

> 
> Regards
> 
> Rüdiger

Reply via email to