Nova is comprised of multiple server process, each performing different functions in different context.The user-facing interface is a REST API, while internally Nova components communicate via an RPC message passing mechanism.
The API servers process REST requests, which typically involve database reads/writes process, optionally sending RPC messages to other Nova services, and generating responses to the REST calls. RPC messaging is done by oslo.messaging library, an abstraction on top of message queues. Most of the major nova components like nova-network, nova-volume can be run on multiple servers, and have a manager that is listening for RPC messages. The one major exception is nova-compute, where a single process runs on the hypervisor it is managing (except when using the VMware or Ironic drivers). The manager also, optionally, has periodic tasks.
Nova also uses a central database that is (logically) shared between all components. However, to aid upgrade, the DB is accessed through an object layer that ensures an upgraded control plane can still communicate with a nova-compute running the previous release. To make this possible nova-compute proxies DB requests over RPC to a central manager called nova-conductor.