Open-sourcing periodic upstream server resolution and implementing a dedicated service worker.

Maxim Dounin mdounin at mdounin.ru
Wed Jul 20 20:36:03 UTC 2022


Hello!

On Wed, Jul 20, 2022 at 07:08:40PM +0000, Vladimir Kokshenev via nginx-devel wrote:

> Hello!
> 
> This is the two-part proposal to open-source periodic upstream server resolution
> and implement a dedicated service worker for nginx. The purpose of this e-mail
> is to describe the WHY and solicit feedback.
> 
> Nginx supports domain names in the upstream server configuration.
> Currently, domain names are resolved at configuration time only,
> and there are no subsequent name resolutions.
> 
> There are plans to open-source re-resolvable upstream servers.
> This will allow applying DNS updates to upstream configurations in runtime.
> So, there is a need to support periodic asynchronous operations.
> And a dedicated service worker is a possible architectural way to address this.
> 
> The master process reads and parses configuration and creates the service worker
> when needed (in a similar way to cache-related processes).
> 
> The service worker manages periodic name resolutions and updates corresponding
> upstream configurations. The name resolution relies on the existing nginx
> resolver and upstream zone functionality.
> 
> The service worker will be responsible solely for periodic background tasks
> and wouldn't accept client connections.
> 
> The service worker should be the last worker process to shut down
> to maintain the actual state of upstreams when there are active workers.
> 
> Alternative architecture considered was about choosing one of the regular 
> workers (e.g., worker zero) to take care of periodic upstream server resolution,
> but it creates asymmetry in responsibilities and load for this dedicated worker.

Both alternatives look bad to me.

We already have dedicated processes to load and manage caches, and 
I tend to think that the only thing which somehow justifies these 
being dedicated is that cache management implies disk-intensive 
blocking operations.  Mixing these with normal request processing 
will cause latency issues, not to mention will be non-trivial to 
implement.  On the other hand, we are already seeing issues with 
dedicated process being used: in some configurations just one 
cache manager process simply isn't enough to remove all the files 
being add by many worker processes.

As such, I generally tend to think that dedicated processes is a 
wrong way to go.  With any special requirements like "last to shut 
down" the whole idea becomes even worse.  And in this particular 
case all operations are perfectly asynchronous, so there is no 
justification like in the cache manager case.

Similarly, "choosing one of the regular workers (e.g., worker 
zero)" looks wrong (and I've already provided this feedback 
previously).  All workers are expected to be equal, and doing 
something only in a particular worker is expected to cause issues.  
E.g., consider a worker is stopped (due to a bug or intentionally 
to debug an issue) - this shouldn't disrupt operations of other 
workers.

Rather, I would recommend focusing on doing all periodic tasks in 
a way which doesn't depend on being run in the particular worker.  
The simplest approach would be to run tasks in all worker 
processes, with some minimal checks to avoid duplicate work.

-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx-devel mailing list