RPC Layer Requirements and Design

Hello all,

We’ve published an initial draft of the requirements document for the RPC layer on the project’s GitHub wiki: https://github.com/apple/foundationdb/wiki/FoundationDB-RPC-Layer-Requirements. The intent of this layer is to provide a straightforward and stable protocol for clients that makes it easier to write pure language bindings (i.e. not dependent on our client library) and simplifies the story around versioning and upgrades.

If this is a topic that interests you, please take a look and let us know what you think! Feel free to provide any feedback directly in this forum thread or a new one, as appropriate.


This is great!!! We really need such a layer for increasing #clients and collect devops metrics.

There is no explicit mention on how we will do “load balancing” across processes of this layer.

Since the draft already mentions that each independent process will provide it’s metrics in some form (push OR pull), one can route clients to less loaded processes (only) during discovery phase. In this way, there is no need to have explicit load balancing logic in the client driver.
Is this understanding correct?

Thats a good question. Attaching clients to a single server process could be one way to enforce that transaction sessions are maintained with the same RPC server. I think we’re trying to leave the discovery aspect somewhat open ended, such that identifying the RPC endpoints could be done through existing mechanisms that people operate or by connecting to the cluster using the cluster file, as we do now. We’d need to consider whether this makes sense in that context.

If we go the route of implementing load balancing in the client binding, one option could be to persist a connection to a random server process and then move if it fails or signals to you that it needs you to move. Or perhaps each transaction could choose an arbitrary server process from all or a subset of the available ones.