Nasazení aktualizace jakékoli aplikace může být riskantní, protože nový kód může obsahovat nové chyby. Unit testování je vhodnou metodou snižování rizika. Některé mechanismy jsou však závislé na pracovní zátěži. Některé úlohy lze simulovat snadněji než jiné. Service Fabric poskytuje monitorování stavu po nasazení nové verze aplikace do clusteru. Pokud nová verze není v pořádku, stará verze se automaticky vrátí zpět. Nastavení ochrany proti výpadkům způsobeným upgrady je poměrně snadné.
Vytvořte novou stavovou službu Service Fabric, otevřete třídu Stateful1.cs a nahraďte její obsah následujícím kódem:
using Microsoft.ServiceFabric.Services.Communication.Runtime;
using Microsoft.ServiceFabric.Services.Runtime;
using System;
using System.Collections.Generic;
using System.Fabric;
using System.Fabric.Health;
using System.Threading;
using System.Threading.Tasks;
namespace Stateful1 {
internal sealed class Stateful1 : StatefulService {
public Stateful1(StatefulServiceContext context) : base(context) { }
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() {
return new ServiceReplicaListener[0];
}
protected override async Task RunAsync(CancellationToken cancellationToken) {
var version = Context.CodePackageActivationContext.GetServiceManifestVersion();
ServiceEventSource.Current.ServiceMessage(Context, $"version: {version}", Context.ServiceName);
while (!cancellationToken.IsCancellationRequested) {
if (version == "1.0.0") {
var healthInformation = new HealthInformation(nameof(Stateful1), "Watchdog", HealthState.Ok) {
TimeToLive = TimeSpan.FromMinutes(1)
};
FabricRuntime.GetActivationContext().ReportDeployedServicePackageHealth(healthInformation);
await Task.Delay(TimeSpan.FromSeconds(10), cancellationToken);
} else {
var healthInformation = new HealthInformation(nameof(Stateful1), "Watchdog", HealthState.Ok) {
TimeToLive = TimeSpan.FromSeconds(10)
};
FabricRuntime.GetActivationContext().ReportDeployedServicePackageHealth(healthInformation);
await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken);
}
}
}
}
}
Jak vidíte, existuje třída HealthInformation
. Hlásí zdravotní stav některých nemovitostí. Stav celé služby se skládá z několika vlastností. Informace o zdravotním stavu mohou být platné, dokud nejsou přepsány, nebo mohou být pravidelně zajišťovány jako platné. V tomto případě musí být nastaven interval TimeToLive. Když interval vyprší a nejsou k dispozici nové informace o stavu, stav se automaticky změní na Error.
Výše uvedený kód simuluje dvě verze stejné služby. V první verzi je jednotka práce provedena dříve, než vyprší platnost informací o zdravotním stavu. Poté se smyčka spustí znovu, informace o stavu se obnoví a celý cyklus začne znovu.
V novější verzi trvá jednotka práce déle, takže platnost informací o stavu vyprší dříve než je práce dokončena. Simuluje neočekávaný pokles výkonu služby. Služba nebude po většinu času v pořádku a Service Fabric ji může detekovat a zastavit upgrade.
Publikujte aplikaci obvyklým způsobem a poté aktualizujte její verzi.
- V souboru ApplicationManifest.xml aktualizujte atribut
ApplicationTypeVersion
elementuApplicationManifest
. - V souboru ServiceManifest.xml aktualizujte atribut
Version
elementuServiceManifest
. - V souboru ServiceManifest.xml aktualizujte atribut
Version
prvkuCodePackage
.
Aplikaci znovu publikujte, ale změňte nastavení. Zaškrtněte možnost Upgrade the Application.
Klikněte na odkaz Configure Upgrade Settings a nastavte režim upgradu podle Monitored. Ověřte, zda je vlastnost FailureAction nastavena na hodnotu Rollback.
Klikněte na tlačítko Publish a otevřete Service Fabric Explorer. Vidíte, že probíhá jeden upgrade.
Upgrade se zpracuje a monitoruje se stav služby.
Pokud služba po upgradu není v pořádku, provede se downgrade na původní verzi.
Monitorování stavu může odrážet kvalitu služby a blokovat upgrade, pokud se kvalita služby sníží.