Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Orleans a silók megfigyelhető életciklust használnak a rendszerek és az alkalmazásréteg összetevőinek rendezett indításához és leállításához Orleans . A megvalósítás részleteiről további információt az életciklusban találOrleans.
Szakaszok
Orleans a siló és a rendszer kliensei közös szolgáltatás-életciklus szakaszokat használnak:
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: A szolgáltatás életciklusának első szakasza.
- ServiceLifecycleStage.RuntimeInitialize: A futtatókörnyezet inicializálása, ahol a siló inicializálja a szálkezelést.
- ServiceLifecycleStage.RuntimeServices: A futtatókörnyezeti szolgáltatások elindítása, ahol a siló inicializálja a hálózatkezelést és a különböző ügynököket.
- ServiceLifecycleStage.RuntimeStorageServices: A futtatókörnyezeti tároló inicializálása.
- ServiceLifecycleStage.RuntimeGrainServices: A szemcsék futtatókörnyezeti szolgáltatásainak indítása. Ez magában foglalja a gabonatípus-kezelést, a tagsági szolgáltatást és a gabonakönyvtárat.
- ServiceLifecycleStage.ApplicationServices: Alkalmazásréteg-szolgáltatások.
- ServiceLifecycleStage.BecomeActive: A siló csatlakozik a klaszterhez.
- ServiceLifecycleStage.Active: A siló aktív a fürtben, és készen áll a terhelés befogadására.
- ServiceLifecycleStage.Last: A szolgáltatás életciklusának utolsó szakasza.
Fakitermelés
A vezérlés inverziója miatt, amelyben a szereplők az életciklus részévé válnak, nem mindig egyértelmű a kódból, hogy mi az indítási és leállítási sorrend. Ennek megoldására Orleans hozzáad egy naplózást, hogy jelentést adjon a siló indítása előtt, mely összetevők vesznek részt az egyes fázisokban. Ezeket a naplókat a rendszer az Információs napló szintjén rögzíti a Orleans.Runtime.SiloLifecycleSubject naplózón. Például:
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"
Emellett Orleans az egyes összetevők időzítési és hibaadatait is naplózza fázisonként. Például:
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."
Részvétel a siló életciklusában
Az alkalmazáslogika úgy vehet részt a siló életciklusában, hogy regisztrál egy részt vevő szolgáltatást a siló szolgáltatástárolójában. Regisztrálja a szolgáltatást ILifecycleParticipant<TLifecycleObservable>, ahol T
van ISiloLifecycle.
public interface ISiloLifecycle : ILifecycleObservable
{
}
public interface ILifecycleParticipant<TLifecycleObservable>
where TLifecycleObservable : ILifecycleObservable
{
void Participate(TLifecycleObservable lifecycle);
}
A siló elindulásakor a tároló összes résztvevője (ILifecycleParticipant<ISiloLifecycle>
) részt vehet, ha meghívják a viselkedésüket ILifecycleParticipant<TLifecycleObservable>.Participate. Miután mindenkinek lehetősége volt a részvételre, a siló megfigyelhető életciklusa minden szakaszt sorrendben indít el.
példa
A siló életciklusának bevezetésével a rendszerindítási szolgáltatókra, amelyek korábban lehetővé tették a logika beinjektálását a szolgáltató inicializálási fázisában, már nincs szükség. Mostantól a silóindítás bármely szakaszában injektálhat alkalmazáslogikát. Ennek ellenére hozzáadtunk egy "indítási feladat" homlokzatot, amely segít az áttérésben a bootstrap-szolgáltatókat használó fejlesztők számára. A siló életciklusában részt vevő összetevők fejlesztésének példájaként tekintsük meg az indítási feladat homlokzatát.
Az indítási feladatnak csak a ILifecycleParticipant<ISiloLifecycle>
-ból kell örökölnie, és az alkalmazáslogikát a siló életciklusának megadott szakaszában kell összekapcsolnia.
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));
}
}
Az előző implementációból látható, hogy a Participate(...)
hívásban feliratkozik a siló életciklusára a konfigurált szakaszban, és az inicializálási logika helyett az alkalmazás visszahívását adja át. Az adott fázisban inicializálásra szoruló összetevők visszahívást biztosítanak, de a minta változatlan marad. Most, hogy biztosítva van, hogy az alkalmazás hookja a konfigurált szakaszban meghívódik, gondoskodnia kell arról, hogy a StartupTask
részt vegyen a siló életciklusában.
Ehhez csak regisztrálni kell a tárolóban. Ezt egy bővítőfüggvény használatával teheti meg a ISiloHostBuilder-on.
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;
}
Ha a StartupTask
-t jelölő felületként regisztrálja a siló szolgáltatási tárolójában, jelezheti a silónak, hogy ennek az összetevőnek részt kell vennie a siló életciklusában.