Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Orleans Silos verwenden einen feststellbaren Lebenszyklus für den geordneten Start und das Herunterfahren von Orleans Systemen und Anwendungsschichtkomponenten. Weitere Informationen zu den Implementierungsdetails finden Sie im Orleans Lebenszyklus.
Phasen
Orleans Silo- und Clusterclients verwenden eine gemeinsame Gruppe von Dienstlebenszyklusphasen:
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: Die erste Phase des Dienstlebenszyklus.
- ServiceLifecycleStage.RuntimeInitialize: Initialisierung der Laufzeitumgebung, in der das Silo Threading initialisiert.
- ServiceLifecycleStage.RuntimeServices: Start der Laufzeitdienste, bei denen das Silo Netzwerk und verschiedene Agents initialisiert.
- ServiceLifecycleStage.RuntimeStorageServices: Initialisierung des Laufzeitspeichers.
- ServiceLifecycleStage.RuntimeGrainServices: Beginn der Laufzeitdienste für Getreide. Dazu gehören die Getreidetypverwaltung, der Mitgliedschaftsdienst und das Kornverzeichnis.
- ServiceLifecycleStage.ApplicationServices: Anwendungsschichtdienste.
- ServiceLifecycleStage.BecomeActive: Das Silo verbindet den Cluster.
- ServiceLifecycleStage.Active: Das Silo ist im Cluster aktiv und bereit, Arbeitsauslastung zu akzeptieren.
- ServiceLifecycleStage.Last: Die letzte Phase des Dienstlebenszyklus.
Protokollierung
Aufgrund der Inversion der Kontrolle, bei der die Teilnehmer am Lebenszyklus teilnehmen, anstatt dass der Lebenszyklus durch einen zentralen Satz von Initialisierungsschritten gesteuert wird, ist aus dem Code nicht immer klar ersichtlich, in welcher Reihenfolge das System gestartet oder heruntergefahren wird. Um dieses Problem zu beheben, wird die Protokollierung vor dem Silostart hinzugefügt, damit Orleans meldet, welche Komponenten an den einzelnen Phasen teilnehmen. Diese Einträge werden auf der Informationsebene im Orleans.Runtime.SiloLifecycleSubject Logger aufgezeichnet. Beispiel:
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"
Darüber hinaus werden ähnlich Orleans Zeitmessungs- und Fehlerinformationen für jede Komponente nach Stufe protokolliert. Beispiel:
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."
Teilnahme am Silo-Lebenszyklus
Ihre Anwendungslogik kann am Lebenszyklus des Silos teilnehmen, indem sie einen teilnehmenden Dienst im Servicecontainer des Silos registrieren. Registrieren Sie den Dienst als ILifecycleParticipant<TLifecycleObservable> ein, wobei TISiloLifecycle ist.
public interface ISiloLifecycle : ILifecycleObservable
{
}
public interface ILifecycleParticipant<TLifecycleObservable>
where TLifecycleObservable : ILifecycleObservable
{
void Participate(TLifecycleObservable lifecycle);
}
Wenn das Silo beginnt, können alle Teilnehmer (ILifecycleParticipant<ISiloLifecycle>) im Container teilnehmen, indem ihr ILifecycleParticipant<TLifecycleObservable>.Participate Verhalten aufgerufen wird. Sobald alle die Möglichkeit hatten, teilzunehmen, beginnt der feststellbare Lebenszyklus des Silos alle Phasen in der Reihenfolge.
Beispiel
Mit der Einführung des Silolebenszyklus sind Bootstrap-Anbieter, mit denen Sie zuvor Logik in die Initialisierungsphase des Anbieters einfügen konnten, nicht mehr erforderlich. Sie können nun Anwendungslogik in jede Phase des Silostarts einfügen. Dennoch haben wir eine "Startaufgabe"-Fassade hinzugefügt, um den Übergang für Entwickler zu unterstützen, die Bootstrap-Anbieter verwendet haben. Als Beispiel dafür, wie Sie Komponenten entwickeln können, die am Lebenszyklus des Silos teilnehmen, sehen wir uns die Startaufgabenfassade an.
Die Startaufgabe muss nur von ILifecycleParticipant<ISiloLifecycle> erben und die Anwendungslogik im Silolebenszyklus in der angegebenen Phase abonnieren.
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));
}
}
Aus der vorherigen Implementierung können Sie sehen, dass er im Participate(...) Aufruf den Silolebenszyklus in der konfigurierten Phase abonniert und den Anwendungsrückruf anstelle seiner Initialisierungslogik übergibt. Komponenten, die in einer bestimmten Phase initialisiert werden müssen, stellen ihre Callback-Funktion bereit, aber das Grundmuster bleibt gleich. Nachdem Sie nun sichergestellt StartupTask haben, dass der Hook der Anwendung in der konfigurierten Phase aufgerufen wird, müssen Sie sicherstellen, dass StartupTask am Silolebenszyklus teilnimmt.
Dazu müssen Sie sie nur im Container registrieren. Verwenden Sie dazu eine Erweiterungsfunktion unter ISiloHostBuilder:
public static ISiloHostBuilder AddStartupTask(
this ISiloHostBuilder builder,
Func<IServiceProvider, CancellationToken, Task> startupTask,
int stage = ServiceLifecycleStage.Active)
{
builder.ConfigureServices(services =>
services.AddTransient<ILifecycleParticipant<ISiloLifecycle>>(
serviceProvider =>
new StartupTask(
serviceProvider, startupTask, stage)));
return builder;
}
Indem Sie StartupTask im Servicecontainer des Silos als Markerschnittstelle ILifecycleParticipant<ISiloLifecycle> registrieren, signalisieren Sie dem Silo, dass diese Komponente am Lebenszyklus des Silos teilnehmen muss.