Using round robin for load balancing if hash key is empty

Niklas Keller me at kelunik.com
Wed May 22 19:59:46 UTC 2019


Hey,

I'd like to propose falling back to round robin if the hash key is
empty. This allows using hashed cookie values for sticky sessions
while using round robin for all requests that do not carry any session
information and thus do not need the stickiness. While Nginx Plus
allows to use the learning mode, this patch avoids the need for
synchronization between multiple instances.

Instead of falling back to round robin automatically, this could also
be changed to offer a configuration option, but I think it's a
sensible default.

An additional configuration option could be added in the future to
change the fallback from round robin to another node selection
strategy.

You can find the patch at the end of this email.

Kind regards,
Niklas

# HG changeset patch
# User Niklas Keller <me at kelunik.com>
# Date 1558554036 -7200
#      Wed May 22 21:40:36 2019 +0200
# Node ID 34015c26b7fe9bda83390d25d989acb109c8d1ea
# Parent  234373adb2ce6023e69e527cbf2b60adf70b1130
Use round-robin if hash key is empty

diff -r 234373adb2ce -r 34015c26b7fe
src/http/modules/ngx_http_upstream_hash_module.c
--- a/src/http/modules/ngx_http_upstream_hash_module.c  Tue May 21
17:23:57 2019 +0300
+++ b/src/http/modules/ngx_http_upstream_hash_module.c  Wed May 22
21:40:36 2019 +0200
@@ -178,7 +178,7 @@

     ngx_http_upstream_rr_peers_rlock(hp->rrp.peers);

-    if (hp->tries > 20 || hp->rrp.peers->single) {
+    if (hp->tries > 20 || hp->rrp.peers->single || hp->key.len == 0) {
         ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
         return hp->get_rr_peer(pc, &hp->rrp);
     }


More information about the nginx-devel mailing list