Guides pratiques Aspire
Chaque section ici décrit une tâche avec l'intégration Aspire de FoundationDB. Elles supposent que
vous avez déjà un AppHost qui appelle AddFoundationDb et un service qui appelle AddFoundationDb,
comme dans Getting started. Pour les tables des paramètres et des
modificateurs, voyez la référence ; pour comprendre pourquoi ces pièces
s'assemblent, voyez l'explication.
Se connecter à un cluster existant
Pour le staging, la production, ou tout cluster qu'Aspire n'a pas démarré, utilisez
AddFoundationDbCluster avec un cluster file au lieu de AddFoundationDb. Il ne démarre aucun
container ; il passe le cluster file aux services qui le référencent :
var fdb = builder.AddFoundationDbCluster("fdb",
apiVersion: 730,
root: "/Sandbox/Acme",
clusterFile: "/etc/foundationdb/fdb.cluster");
builder.AddProject<Projects.Acme_Backend>("backend")
.WithReference(fdb);
Un service lit la connexion de la même façon dans les deux cas (AddFoundationDb("fdb")), donc le
code du service ne change pas entre un container local et un cluster externe.
Réutiliser le cluster et ses données d'une exécution à l'autre
Par défaut, AddFoundationDb crée un nouveau container à chaque exécution, donc les données ne
survivent pas à un redémarrage. Pour garder le container et son volume, marquez la ressource cluster
comme persistante :
var fdb = builder.AddFoundationDb("fdb", apiVersion: 740, root: "/Sandbox/Acme", clusterVersion: "7.4.6")
.WithLifetime(ContainerLifetime.Persistent);
Une exécution ultérieure retrouve le même volume, donc la base de données est déjà configurée et l'étape de provisioning est sautée.
Épingler ou faire évoluer la version du cluster
clusterVersion sélectionne le tag de l'image Docker, et rollForward décide jusqu'où une image
plus récente peut être prise. La forme string de clusterVersion fixe un rollForward par défaut
que vous pouvez surcharger :
// image exacte, jamais de roll forward
builder.AddFoundationDb("fdb", apiVersion: 740, root: "/Sandbox/Acme", clusterVersion: "7.4.6");
// dernier patch 7.4
builder.AddFoundationDb("fdb", apiVersion: 740, root: "/Sandbox/Acme", clusterVersion: "7.4.*");
// dernière mineure 7.x
builder.AddFoundationDb("fdb", apiVersion: 740, root: "/Sandbox/Acme", clusterVersion: "7.*");
Omettez clusterVersion et l'intégration dérive la version depuis apiVersion (le niveau 740 donne
7.4) et progresse jusqu'à la dernière version majeure compatible. La
référence liste chaque valeur de politique et le défaut que
chaque version string implique.
Désactiver l'autoprovisioning
L'intégration configure une base de données neuve au premier démarrage. Pour gérer ça vous-même, désactivez-le sur la ressource cluster :
var fdb = builder.AddFoundationDb("fdb", apiVersion: 740, root: "/Sandbox/Acme", clusterVersion: "7.4.6")
.WithAutoProvisioning(false);
Un volume neuf n'a alors pas de base de données, et tout service qui l'ouvre attend sans erreur jusqu'à ce que vous la configuriez à la main :
docker exec <container> fdbcli --exec "configure new single ssd"
Laissez l'autoprovisioning activé sauf si vous avez une raison de lancer l'étape de configuration vous-même ; désactivé, une première exécution contre un volume neuf se bloque jusqu'à ce que l'étape manuelle s'exécute.
Faire correspondre le client natif au cluster
Un service charge le client natif (FoundationDB.Client.Native), et sa version doit correspondre au
cluster en cours d'exécution à major.minor près. Épinglez-le dans le projet du service à la version
du cluster :
dotnet add package FoundationDB.Client.Native --version "7.4.*"
Ou dans le fichier projet du service :
<ItemGroup>
<!-- autres packages -->
<PackageReference Include="FoundationDB.Client.Native" Version="7.4.*" />
</ItemGroup>
7.4.* se résout au dernier patch 7.4. Cette version suit le cluster, pas le SDK : le
clusterVersion de l'AppHost et le package natif du service doivent s'accorder sur major.minor,
tandis que le package FoundationDB.Aspire garde sa propre version de bibliothèque. Changez le
cluster et vous changez cet épinglage : un cluster 7.3 (apiVersion: 730, clusterVersion: "7.3.x")
a besoin de FoundationDB.Client.Native en 7.3.*. Quand les deux ne s'accordent pas, le service se
connecte puis time out à chaque opération.
Choisir le port hôte du container
AddFoundationDb lie le container au port hôte 4550 par défaut. Passez port pour le changer :
builder.AddFoundationDb("fdb", apiVersion: 740, root: "/Sandbox/Acme", clusterVersion: "7.4.6", port: 4560);
Le port hôte et le port du container sont toujours identiques, et le proxy Aspire est désactivé pour cette ressource : le nœud FoundationDB annonce son propre port aux clients, donc un port hôte remappé les enverrait vers une adresse qui n'existe pas. Choisissez un port libre ; n'attendez pas d'Aspire qu'il le remappe.
Lancer l'AppHost sans la CLI aspire
La CLI aspire provisionne les endpoints du dashboard et de la télémétrie. Un simple dotnet run
sur l'AppHost marche aussi si vous fournissez un Properties/launchSettings.json avec les endpoints
du dashboard et OTLP que la CLI injecterait sinon. Utilisez la CLI sauf si vous avez une raison de
gérer ces endpoints vous-même.
Provisionner une base de données en dehors d'Aspire
L'AppHost et le test harness configurent tous deux une base de données neuve à travers une seule primitive,
Fdb.Provisioning.EnsureDatabaseConfiguredAsync. Appelez-la directement depuis un script ou un
harness personnalisé quand vous provisionnez un cluster vous-même. Elle prend un delegate qui lance
fdbcli, un timeout, et retourne une fois la base de données disponible :
await Fdb.Provisioning.EnsureDatabaseConfiguredAsync(
// votre delegate : lance fdbcli, retourne (code de sortie, sortie)
runFdbCli,
timeout: TimeSpan.FromSeconds(30),
ct: cancellationToken);
Elle est idempotente : une base de données déjà configurée est laissée intacte. Si la base de données n'est pas
disponible avant le timeout, elle throw au lieu d'attendre indéfiniment. Le test harness l'appelle
sur chaque test container fraîchement créé, donc une suite de tests n'a besoin d'aucune étape
fdbcli manuelle.