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

Angus Salkeld asalkeld at redhat.com
Mon Sep 10 22:31:51 UTC 2012


On 10/09/12 22:30 +0100, Mark McLoughlin wrote:
>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?

Well I think the manager class is there because you don't *need* to
inherit from anything, just implement init() and if you want PeriodicTasks
then you inherit from PeriodicTasks. So it simplifies plugins I suppose.

But I get your point, if the above is not important then we could just
have launchers and services. Perhaps I can do this in common and nova can then
do the whole Manager-plugin thing.

-Angus

>
>Cheers,
>Mark.
>



More information about the OpenStack-dev mailing list