Dajbych.net


Service Fabric Hello World

, 5 minut čtení

service fabric logo

Začít s konzolovou aplikací je jednoduché. Zápis řádku textu do konzole je snadný a výsledek je viditelný okamžitě. Podobná situace je u univerzální aplikace pro Windows, kde je ovládací prvek TextBlock. Service Fabric není těžší. Nejobtížnější částí je nastavení diagnostiky, protože cloudové služby nemají žádné uživatelské rozhraní.

Vytvoření projektu

Spusťte Visual Studio jako správce. Otevřete dialogové okno New Project (Soubor → Nový → Project) a zvolte možnost Service Fabric Application (Nainstalované šablony → → Visual C# → Cloud). Vyberte Stateless Service. Vygenerovaný projekt je hello world aplikace. Když stisknete klávesu F5 (nebo kliknete na Start), zobrazí se okno Diagnostics Events a zprávy zaznamenané metodou ServiceEventSource.Current.ServiceMessage ve smyčce.

Principy vstupního bodu

Stejně jako konzolová aplikace má svou metodu Main, každá instance aplikace Service Fabric má svou metodu StartAsync. Nachází se v souboru Stateless1.cs v projektu Stateless1. Metoda je volána automaticky po spuštění instance stejným způsobem, jakým je metoda Main volána po spuštění konzolové aplikace.

Otázkou je, kdy metoda skončí. Přirozeně skončí, když je vyvolána výjimka a není zachycena vaším kódem. Konzolová aplikace se vypne, ale instance Service Fabric se restartuje, aniž by se instance znovu vytvořila. V tomto případě Service Fabric funguje jako časovač hlídacího zařízení. Je zde ale i další indikátor signalizující, kdy má metoda skončit. Může k tomu dojít například v případě, že je třeba po aktualizaci systému restartovat základní operační systém. Existují dvě implementace. První z nich vyvolá výjimku:

protected override async Task RunAsync(CancellationToken cancellationToken) {
  while (true) {
    cancellationToken.ThrowIfCancellationRequested();
    ...
  }
}

A druhý skončí bez nahlášení přechodné poruchy:

protected override async Task RunAsync(CancellationToken cancellationToken) {
  while (!cancellationToken.IsCancellationRequested) {
    ...
  }
}

Obě implementace jsou správné. Blok uvnitř smyčky while obsahuje logiku vaší služby.

Trasování událostí pro Windows

Trasování událostí pro Windows je efektivní mechanismus trasování na úrovni jádra. Události můžete využívat v reálném čase nebo ze souboru protokolu. Nezpomaluje aplikaci, protože zahazuje události při protokolování do souboru, pokud je disk příliš pomalý na to, aby udržel krok s rychlostí protokolování.

Každý zdroj událostí má svůj název. Je definován v § EventSourceAttribute a zdobí třídu ServiceEventSource v souboru ServiceEventSource.cs. Třída Stateless1 je zaregistrována s touto třídou do ETW v souboru Program.cs voláním metody ServiceTypeRegistered.

Analýzy Service Fabric

OMS (Operations Manager Suite) umožňuje vaší organizaci centralizovat monitoring různých služeb bez ohledu na jejich druh. Můžete ho také použít k monitorování clusteru Service Fabric, pokud na virtuálních počítačích Service Fabric nastavíte Azure Diagnostics a nakonfigurujete OMS tak, aby shromažďoval data z tabulky úložiště WAD (Windows Azure Diagnostics).

Application Insights

Další možností je využití AI (Application Insights). Konfigurace byla v minulosti o něco jednodušší díky použití jediného balíčku, ale tento přístup je nyní zastaralý (pravděpodobně proto, že obcházel ETW).

Abychom mohli propojit AI se zdrojem ETW, musíme zahrnout dva projekty z GitHubu. Projekty nejsou k dispozici jako balíčky NuGet. Klonováním zdrojového úložiště můžete udržovat vždy aktuální, ale tento přístup je velmi rušivý, protože obvykle potřebujete nejnovější stabilní a dobře otestovanou verzi, nikoli nejnovější bity.

Je tu ještě jedna možnost. Můžete nainstalovat balíček NuGet Microsoft.Diagnostics.EventFlow.ServiceFabric. Má mnoho závislostí a v tomto scénáři nepodporuje .NET Core. Po instalaci balíčku je váš projekt bohatší pouze o jeden soubor, což je velmi pozitivní. Cesta k souboru je PackageRoot\Config\eventFlowConfig.json. V tomto souboru je třeba odkomentovat oddíl s nastavením Application Insights a vložit instrumentační klíč.

{
  "outputs": [
    {
      "type": "ApplicationInsights",
      "instrumentationKey": "00000000-0000-0000-0000-000000000000"
    }
  ]
}

Dále musíme identifikovat zdroj událostí, což je hodnota vlastnosti NameEventSourceAttribute zdobící třídu ServiceEventSource v souboru ServiceEventSource.cs.

{
  "inputs": [
    {
      "type": "EventSource",
      "sources": [
        { "providerName": "MyCompany-StatelessService-Stateless1" }
      ]
    }
  ]
}

Nakonec je nutné nahradit výchozí vstupní bod procesu hostitele služby diagnostickým kanálem.

private static void Main() {
    try {
        using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("MyApplication-MyService-DiagnosticsPipeline")) {
            ServiceRuntime.RegisterServiceAsync("Stateless1Type", ctx => new Stateless1(ctx)).Wait();

            ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Stateless1).Name);

            Thread.Sleep(Timeout.Infinite);
        }
    } catch (Exception e) {
        ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
        throw;
    }
}

Bohužel i spuštění tohoto přístupu lokálně končí s výjimkami různých druhů v závislosti na cílovém frameworku (.NET 4.5.2, .NET 4.6.2) a chování závislostí NuGet (nejnižší, nejvyšší).

Moje alternativní řešení

Nainstalujte balíček NuGet Microsoft.ApplicationInsights.WindowsServer .

Vytvořte instanci třídy TelemetryClient v singleton nebo statické třídě.

using Microsoft.ApplicationInsights;
internal sealed class Stateless1 : StatelessService {
    private readonly TelemetryClient telemetry = new TelemetryClient();
    ...
}

Upravte soubor ApplicationInsights.config vložením instrumentačního klíče do něj.

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
  <InstrumentationKey>00000000-0000-0000-0000-000000000000</InstrumentationKey>
  ...
</ApplicationInsights>

Použijte TelemetryClient jako bránu k telemetrii Application Insights.

protected override async Task RunAsync(CancellationToken cancellationToken) {
    long iterations = 0;
    while (true) {
        cancellationToken.ThrowIfCancellationRequested();
        telemetry.TrackTrace($"Hello World - {iterations}");
        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }
}

Nasazení do clusteru Service Fabric

Prvním krokem je vytvoření clusteru Service Fabric. Doporučuji pro něj vytvořit samostatný Resource group, protože vedle clusteru bude vytvořeno mnoho dalších zdrojů – několik účtů úložiště, škálovací sada virtuálních strojů, virtuální síť, load balancer, veřejná IP adresa. Budoucí odstranění clusteru Service Fabric se všemi jeho závislostmi bude mnohem jednodušší.

Service Fabric najdete na webu Azure Portal v části NewComputeService Fabric Cluster.

Pro účely testování doporučuji následující konfiguraci:

Po vytvoření clusteru vyberte Publish… z kontextové nabídky projektu aplikace Service Fabric. Vyberte koncový bod končící na cloudapp.azure.com:19000 a klikněte na Publish.

Na webu Azure Portal na panelu Service Fabric klikněte na…

… a ujistěte se, že je vaše aplikace v pořádku.

Na portálu Azure na panelu Application Insights klikněte na…

… a pak klikněte na malý +

… Napište jedno slovo…

… a klikněte na…

… Pak uvidíte diagnostické zprávy z clusteru.

Až budete hotovi, můžete aplikaci odstranit z clusteru v Service Fabric Exploreru. Uděláte to tak, že vyberete aplikaci na levém panelu a pod tlačítkem Actions v pravém horním rohu zvolíte příkaz Delete Application.