Author: @juho
This proposal defines a Federation Protocol for FTL, allowing an FTL cluster to:
Some systems expose gRPC APIs but don’t provide FTL schemas. Using gRPC reflection, an FTL cluster can:
For environments with multiple FTL clusters (e.g., different teams, cloud regions):
We shall represent external realms in the schema as top level schema
elements. All but one realm in schema are marked as +external
with a metadata marker.
For example, for grpc realm it could look something like
The schema of an +external
realm is fetched from a remote git repo. Each realm is reponsible syncing its schema in file in git repo representing the public API of the realm.
The endpoint the cluster uses to connect to the remote FTL realm is passed as a config value with key <name>-realm-endpoint
When referring to schema elements from other realms, a @<realm>
suffix is used in the referring modules.
To support exporting verbs to be called from other realms, we change the export
annotation to support optional export level. For example, in a Go verb, we can define a verb to be exported from the realm like this:
We will export a public schema, which is all export:realm
verbs and any data used by them by writing a proto-text file to the project root on every change to the public API. This file will be committed with the code changes so it can be consumed by other realms.
It should be generated by every build FTL does.
To avoid dealing with transitive dependencies, we will also add checks that the public API of a realm does not expose data types defined in external realms.
Locally, we will declare external realms in the ftl-project.toml
file, with a separate section for each realm.
The configuration will include the git repo to fetch the external realm schema from, as well as the commit used to fetch the schema to keep builds deterministic. For now, we assume that the ftl-project.toml
is at the root of the external repo. The external schema file in that repo should be defined in ftl-project.toml
We will add a new CLI command for adding new realms:
This adds an entry to ftl-project.toml for a new realm. We shall also store the latest commit from the branch in the ftl-project.toml
This way the config with external realms looks like
To update the commits to the latest, we will add a command
Finally, we shall add commands for managing realms like ftl realm list
and ftl realm remove
The realms are placed in [egress]
block to allow us to record schemas of the calling services in the future. Though, not implemented now, in the future we can also write the calling schema to the target repo when adding a realm dependency to maintain 2-way graph of schemas across realm boundaries.
For now, any calls to a remote realm locally will fail, but we can make the DX for this better in the future by allowing fake or remote connection based development against these APIs.
When a verb in FTL cluster calls an external FTL verb, it is routed to a remote ftl-ingress
service for that realm. The ingress service then routes the call to the runner of the verb.
For any realm not implemented in FTL (like external APIs or a set of gRPC services), the following are needed:
ftl-ingress
endpoint for any external calls. This proxy needs to be able to translate FTL calls to any native format that might be used internally in the realm.The runtimes need to be changed to take the realm name into account when generating clients, by using the realm appropriately in the client package path.
We could ask users to import proto files for remote grpc services or FTL modules they want to call as local modules.
However, this would be too much maintenance for engineers.
The ftl clusters could sync the schema of remote clusters at runtime, but that would require connectivity to a cluster for developers for local development, and would make dealing with breaking changes difficult.