Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Orleans silo's gebruiken een waarneembare levenscyclus voor het geordende opstarten en afsluiten van Orleans systemen en toepassingslaagonderdelen. Zie de levenscyclus voor meer informatie over de implementatiedetailsOrleans.
Stadia
Orleans silo- en clusterclients maken gebruik van een algemene set levenscyclusfasen van de service:
public static class ServiceLifecycleStage
{
public const int First = int.MinValue;
public const int RuntimeInitialize = 2_000;
public const int RuntimeServices = 4_000;
public const int RuntimeStorageServices = 6_000;
public const int RuntimeGrainServices = 8_000;
public const int ApplicationServices = 10_000;
public const int BecomeActive = Active - 1;
public const int Active = 20_000;
public const int Last = int.MaxValue;
}
- ServiceLifecycleStage.First: De eerste fase in de levenscyclus van de service.
- ServiceLifecycleStage.RuntimeInitialize: Initialisatie van de runtime-omgeving, waarbij de silo threading initialiseert.
- ServiceLifecycleStage.RuntimeServices: Start van runtime-services, waarbij de silo netwerken en verschillende agents initialiseert.
- ServiceLifecycleStage.RuntimeStorageServices: Initialisatie van runtimeopslag.
- ServiceLifecycleStage.RuntimeGrainServices: Het starten van runtimeservices voor korrels. Dit omvat graantypebeheer, lidmaatschapsservice en grain-directory.
- ServiceLifecycleStage.ApplicationServices: Toepassingslaag services.
- ServiceLifecycleStage.BecomeActive: De silo treedt toe tot de cluster.
- ServiceLifecycleStage.Active: De silo is actief in het cluster en kan de workload accepteren.
- ServiceLifecycleStage.Last: De laatste fase in de levenscyclus van de service.
Loggen
Vanwege de inversie van controle, waarbij deelnemers deelnemen aan de levenscyclus in plaats van de levenscyclus met een gecentraliseerde set initialisatiestappen, is het niet altijd duidelijk uit de code wat de opstart-/afsluitvolgorde is. U kunt dit oplossen door Orleans logboekregistratie toe te voegen voordat silo wordt opgestart om te rapporteren welke onderdelen in elke fase deelnemen. Deze logboeken worden vastgelegd op het informatieniveau van de Orleans.Runtime.SiloLifecycleSubject logger. Bijvoorbeeld:
Information, Orleans.Runtime.SiloLifecycleSubject, "Stage 2000: Orleans.Statistics.PerfCounterEnvironmentStatistics, Orleans.Runtime.InsideRuntimeClient, Orleans.Runtime.Silo"
Information, Orleans.Runtime.SiloLifecycleSubject, "Stage 4000: Orleans.Runtime.Silo"
Information, Orleans.Runtime.SiloLifecycleSubject, "Stage 10000: Orleans.Runtime.Versions.GrainVersionStore, Orleans.Storage.AzureTableGrainStorage-Default, Orleans.Storage.AzureTableGrainStorage-PubSubStore"
Daarnaast Orleans registreert u op dezelfde manier tijds- en foutinformatie voor elk onderdeel per fase. Bijvoorbeeld:
Information, Orleans.Runtime.SiloLifecycleSubject, "Lifecycle observer Orleans.Runtime.InsideRuntimeClient started in stage 2000 which took 33 Milliseconds."
Information, Orleans.Runtime.SiloLifecycleSubject, "Lifecycle observer Orleans.Statistics.PerfCounterEnvironmentStatistics started in stage 2000 which took 17 Milliseconds."
Deelname aan de levenscyclus van silo's
Uw toepassingslogica kan deelnemen aan de levenscyclus van de silo door een deelnemende service te registreren in de servicecontainer van de silo. Registreer de service als een ILifecycleParticipant<TLifecycleObservable>, waarbij TISiloLifecycle is.
public interface ISiloLifecycle : ILifecycleObservable
{
}
public interface ILifecycleParticipant<TLifecycleObservable>
where TLifecycleObservable : ILifecycleObservable
{
void Participate(TLifecycleObservable lifecycle);
}
Wanneer de silo wordt gestart, kunnen alle deelnemers (ILifecycleParticipant<ISiloLifecycle>) in de container deelnemen door hun ILifecycleParticipant<TLifecycleObservable>.Participate gedrag aan te roepen. Zodra iedereen de mogelijkheid heeft gehad om deel te nemen, begint de waarneembare levenscyclus van de silo alle fasen in volgorde.
Voorbeeld
Met de introductie van de silolevenscyclus zijn bootstrapproviders, waarmee u eerder logica kon injecteren in de initialisatiefase van de provider, niet meer nodig. U kunt nu toepassingslogica injecteren in elke fase van het opstarten van silo's. Niettemin hebben we een 'starttaak'-gevel toegevoegd om ontwikkelaars die bootstrapproviders hebben gebruikt te helpen bij de overgang. Laten we eens kijken naar de opstarttaak-facade om te laten zien hoe u onderdelen kunt ontwikkelen die deelnemen aan de levenscyclus van de silo.
De opstarttaak hoeft alleen van ILifecycleParticipant<ISiloLifecycle> te erven en de toepassingslogica te koppelen aan de levenscyclus van de silo in de opgegeven fase.
class StartupTask : ILifecycleParticipant<ISiloLifecycle>
{
private readonly IServiceProvider _serviceProvider;
private readonly Func<IServiceProvider, CancellationToken, Task> _startupTask;
private readonly int _stage;
public StartupTask(
IServiceProvider serviceProvider,
Func<IServiceProvider, CancellationToken, Task> startupTask,
int stage)
{
_serviceProvider = serviceProvider;
_startupTask = startupTask;
_stage = stage;
}
public void Participate(ISiloLifecycle lifecycle)
{
lifecycle.Subscribe<StartupTask>(
_stage,
cancellation => _startupTask(_serviceProvider, cancellation));
}
}
In de voorgaande implementatie kunt u zien dat in de Participate(...)-aanroep wordt ingeschreven op de levenscyclus van de silo in de geconfigureerde fase, waarbij de callback van de applicatie wordt doorgegeven in plaats van de initialisatielogica. Onderdelen die in een bepaalde fase initialisatie nodig hebben, bieden hun callbackfunctie aan, maar het patroon blijft ongewijzigd. Nu u ervoor hebt gezorgd voor StartupTask dat de hook van de toepassing wordt aangeroepen in de geconfigureerde fase, moet u ervoor zorgen dat de StartupTask deelneemt aan de silolevenscyclus.
Hiervoor registreert u deze in de container met behulp van de AddStartupTask extensiemethode op de silobouwer:
siloBuilder.AddStartupTask(
async (serviceProvider, cancellationToken) =>
{
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Silo is starting up...");
// Perform initialization logic, such as warming caches or validating configuration
var config = serviceProvider.GetRequiredService<IConfiguration>();
await ValidateExternalDependenciesAsync(config, cancellationToken);
},
ServiceLifecycleStage.Active);
Door de servicecontainer van de StartupTask silo te registreren als de markeringsinterface ILifecycleParticipant<ISiloLifecycle>, signaleert u de silo dat dit onderdeel moet deelnemen aan de levenscyclus van de silo.