[openstack-dev] Nova's service infrastructure in openstack-common

Mark McLoughlin markmc at redhat.com
Mon Sep 10 21:30:22 UTC 2012


Hi Angus,

Looking at the service infrastructure stuff proposed for
openstack-common again:

  https://blueprints.launchpad.net/openstack-common/+spec/service-infrastructure

I always get a bit lost with all the classes and abstractions we have
going on this space, so I spent some time thinking about how it might be
improved.

None of this is necessarily stuff that needs fixing before your patches
can be merged, but I felt we needed to have a better picture of where
we're going.

So ... my attempt at simplifying the abstractions:

 - A Launcher class with the following methods:

     launch_service(service)
     stop()
     wait()

   A launcher can be responsible for multiple services.

   There are two subclasses of this. The first - ServiceLauncher - 
   handles a TERM/INT signal by stopping the services. The second -
   ProcessLauncher - will start a number of child processes, each child
   process running the service.

 - A Service class with the following methods:

     start()
     stop()
     wait()

   A service is associated with a Server object.

   A service also has a thread group whose members are stopped when the
   service is stopped.

 - A Server base class with the following methods:

     init(service)

   Server sub-classes PeriodicTasks, so it supports the @periodic_task
   decorator on its methods. The init() method of Server will spawn a
   timer thread from the service's thread group to run the periodic
   tasks from.

   There are two further sub-classes of Server which themselves are also
   base classes - rpc.Server and wsgi.Server. Sub-classes of rpc.Server
   and wsgi.Server will typically hook into the init() method and add
   methods which are decorated with @periodic_task.

 - The rpc.Server base class creates an RPC dispatcher which exposes all
   of the server's public methods over RPC via a given topic. All RPC
   calls will be handled in a thread spawned from the service's thread
   group.

 - The wsgi.Server base class exposes a WSGI over application a given 
   port and spawns threads from the service's thread group to handle
   requests.

The differences between this and what we currently have is:

 - We no longer have these fairly similar "manager" and "server"
   concepts that are completely different but mostly about WSGI vs RPC.

 - The functionality of the init_host() hook and periodic tasks are 
   available to both WSGI and RPC servers.

 - The Service class doesn't know anything about WSGI vs RPC servers, 
   all that knowledge is moved into the Server base classes.

 - init_host() is renamed to init(), since the "host" bit is fairly
   meaningless.

 - All green threads are spawned from the service's thread group.

But, actually, I'm now starting to struggle with justifying the
Server/Service split ... why do we need both?

Cheers,
Mark.




More information about the OpenStack-dev mailing list