Doprovodné materiály k architektuře nabízení v podnicích

Podniky se v současné době postupně pohybují směrem k vytváření mobilních aplikací pro koncové uživatele (externí) nebo pro zaměstnance (interní). Mají stávající back-endové systémy, ať už jde o sálové počítače nebo některé aplikace LoB, které musí být integrované do architektury mobilních aplikací. Tato příručka popisuje, jak nejlépe provést tuto integraci a doporučovat možné řešení pro běžné scénáře.

Častým požadavkem je odesílání nabízených oznámení uživatelům prostřednictvím mobilní aplikace, když dojde k události zájmu v back-endových systémech. Například zákazník banky, který má bankovní aplikaci na i Telefon chce být upozorněn, když je inkaso provedeno nad určitou částku z účtu nebo intranetového scénáře, kdy zaměstnanec z finančního oddělení, který má aplikaci schválení rozpočtu ve Windows Telefon chce být upozorněn při přijetí žádosti o schválení.

Zpracování bankovního účtu nebo schválení bude pravděpodobně provedeno v některém back-endovém systému, který musí inicializovat nabízení uživateli. Může existovat několik takových back-endových systémů, které musí všechny sestavit stejný druh logiky, který se má odeslat, když událost aktivuje oznámení. Složitost spočívá v integraci několika back-endových systémů spolu s jedním systémem nabízených oznámení, kde se koncoví uživatelé mohli přihlásit k odběru různých oznámení a dokonce i několik mobilních aplikací. Například intranetové mobilní aplikace, kde jedna mobilní aplikace může chtít dostávat oznámení z více takových back-endových systémů. Back-endové systémy neví ani nepotřebují znát sémantiku nabízení nebo technologie, takže běžným řešením zde tradičně bylo zavedení komponenty, která se dotazuje back-endových systémů na jakékoli události, které vás zajímají, a zodpovídá za odesílání nabízených zpráv klientovi.

Lepším řešením je použít Azure Service Bus – Model tématu nebo předplatného, který snižuje složitost a současně je řešení škálovatelné.

Tady je obecná architektura řešení (generalizovaná s více mobilními aplikacemi, ale stejně použitelná, pokud existuje jenom jedna mobilní aplikace).

Architektura

Diagram of the enterprise architecture showing the flow through Events, Subscriptions, and Push Messages.

Klíčovou součástí tohoto diagramu architektury je Služba Azure Service Bus, která poskytuje programovací model témat/odběrů (více na něm na webu Service Bus Pub/Sub programming). Příjemce, který v tomto případě představuje mobilní back-end (obvykle Azure Mobile Service, který inicializuje nabízení do mobilních aplikací), nepřijímá zprávy přímo z back-endových systémů, ale zprostředkující abstrakce vrstvy poskytované službou Azure Service Bus, která umožňuje mobilním back-endům přijímat zprávy z jednoho nebo více back-endových systémů. Téma služby Service Bus je potřeba vytvořit pro každý z back-endových systémů, například účet, personální oddělení, finance, což je v podstatě "témata", která iniciuje odesílání zpráv jako nabízené oznámení. Back-endové systémy odesílají zprávy do těchto témat. Mobilní back-end se může přihlásit k odběru jednoho nebo několika takových témat vytvořením předplatného služby Service Bus. Opravňuje mobilní back-end k přijetí oznámení z odpovídajícího back-endového systému. Mobilní back-end bude dál naslouchat zprávám v jejich odběrech a jakmile zpráva dorazí, vrátí se zpět a odešle ji jako oznámení do centra oznámení. Centra oznámení pak nakonec zprávu doručí do mobilní aplikace. Tady je seznam klíčových komponent:

  1. Back-endové systémy (loB/starší systémy)
    • Vytvoří téma služby Service Bus.
    • Odešle zprávu.
  2. Mobilní back-end
    • Vytvoří předplatné služby.
    • Přijímá zprávu (z back-endového systému)
    • Odesílá oznámení klientům (přes Centrum oznámení Azure).
  3. Mobilní aplikace
    • Příjem a zobrazení oznámení

Zaměstnanecké výhody

  1. Oddělení mezi příjemcem (mobilní aplikace nebo služba prostřednictvím centra oznámení) a odesílatelem (back-endové systémy) umožňuje integraci dalších back-endových systémů s minimálními změnami.
  2. Díky tomu může scénář více mobilních aplikací přijímat události z jednoho nebo více back-endových systémů.

Vzorek

Požadavky

Projděte si následující kurzy, abyste se seznámili s koncepty a běžnými kroky vytváření a konfigurace:

  1. Service Bus Pub/Subprogram – tento kurz vysvětluje podrobnosti o práci s tématy/odběry služby Service Bus, jak vytvořit obor názvů, který bude obsahovat témata nebo odběry, jak od nich odesílat a přijímat zprávy.
  2. Notification Hubs – Univerzální kurz pro Windows – Tento kurz vysvětluje, jak nastavit aplikaci pro Windows Store a jak používat Notification Hubs k registraci a přijímání oznámení.

Ukázkový kód

Úplný vzorový kód je k dispozici v ukázkách centra oznámení. Rozdělí se na tři komponenty:

  1. EnterprisePushBackendSystem

    a. Tento projekt používá balíček NuGet Azure.Messaging.ServiceBus a je založený na programování služby Service Bus Pub/Sub.

    b. Tato aplikace je jednoduchá konzolová aplikace jazyka C#, která simuluje systém LoB, který iniciuje doručení zprávy do mobilní aplikace.

    static async Task Main(string[] args)
    {
        string connectionString =
            ConfigurationManager.AppSettings.Get("Azure.ServiceBus.ConnectionString");
    
        // Create the topic
        await CreateTopicAsync(connectionString);
    
        // Send message
        await SendMessageAsync(connectionString);
    }
    

    c. CreateTopicAsync slouží k vytvoření tématu služby Service Bus.

    public static async Task CreateTopicAsync(string connectionString)
    {
        // Create the topic if it does not exist already
        ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString);
    
        if (!await client.TopicExistsAsync(topicName))
        {
            await client.CreateTopicAsync(topicName);
        }
    }
    

    d. SendMessageAsync slouží k odesílání zpráv do tohoto tématu služby Service Bus. Tento kód jednoduše odešle sadu náhodných zpráv do tématu pravidelně pro účely vzorku. Obvykle existuje back-endový systém, který odesílá zprávy, když dojde k události.

    public static sync Task SendMessageAsync(string connectionString)
    {
        await using var client = new ServiceBusClient(connectionString);
        ServiceBusSender sender = client.CreateSender(topicName);
    
        // Sends random messages every 10 seconds to the topic
        string[] messages =
        {
            "Employee Id '{0}' has joined.",
            "Employee Id '{0}' has left.",
            "Employee Id '{0}' has switched to a different team."
        };
    
        while (true)
        {
            Random rnd = new Random();
            string employeeId = rnd.Next(10000, 99999).ToString();
            string notification = String.Format(messages[rnd.Next(0,messages.Length)], employeeId);
    
            // Send Notification
            ServiceBusMessage message = new ServiceBusMessage(notification);
            await sender.SendMessageAsync(message);
    
            Console.WriteLine("{0} Message sent - '{1}'", DateTime.Now, notification);
    
            System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10));
        }
    }
    
  2. ReceiveAndSendNotification

    a. Tento projekt používá balíčky NuGet Azure.Messaging.ServiceBus a Microsoft.Web.WebJobs.Publish a je založen na programování služby Service Bus Pub/Sub.

    b. Následující konzolová aplikace běží jako webová úloha Azure, protože musí běžet nepřetržitě, aby naslouchala zprávům z loB/back-endových systémů. Tato aplikace je součástí vašeho back-endu Mobile.

    static async Task Main(string[] args)
    {
        string connectionString =
                 ConfigurationManager.AppSettings.Get("Azure.ServiceBus.ConnectionString");
    
        // Create the subscription that receives messages
        await CreateSubscriptionAsync(connectionString);
    
        // Receive message
        await ReceiveMessageAndSendNotificationAsync(connectionString);
    }
    

    c. CreateSubscriptionAsync slouží k vytvoření odběru služby Service Bus pro téma, ve kterém back-endový systém odesílá zprávy. V závislosti na obchodním scénáři tato komponenta vytvoří jedno nebo více odběrů odpovídajících témat (například některé můžou přijímat zprávy ze systému lidských zdrojů, některé z finančního systému atd.)

    static async Task CreateSubscriptionAsync(string connectionString)
    {
        // Create the subscription if it does not exist already
        ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString);
    
        if (!await client.SubscriptionExistsAsync(topicName, subscriptionName))
        {
            await client.CreateSubscriptionAsync(topicName, subscriptionName);
        }
    }
    

    d. ReceiveMessageAndSendNotificationAsync se používá ke čtení zprávy z tématu pomocí jejího odběru a pokud je čtení úspěšné, vytvořte oznámení (v ukázkovém scénáři nativní informační zpráva pro Windows), která se odešle do mobilní aplikace pomocí Azure Notification Hubs.

    static async Task ReceiveMessageAndSendNotificationAsync(string connectionString)
    {
        // Initialize the Notification Hub
        string hubConnectionString = ConfigurationManager.AppSettings.Get
                ("Microsoft.NotificationHub.ConnectionString");
        hub = NotificationHubClient.CreateClientFromConnectionString
                (hubConnectionString, "enterprisepushservicehub");
    
        ServiceBusClient Client = new ServiceBusClient(connectionString);
        ServiceBusReceiver receiver = Client.CreateReceiver(topicName, subscriptionName);
    
        // Continuously process messages received from the subscription
        while (true)
        {
            ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
            var toastMessage = @"<toast><visual><binding template=""ToastText01""><text id=""1"">{messagepayload}</text></binding></visual></toast>";
    
            if (message != null)
            {
                try
                {
                    Console.WriteLine(message.MessageId);
                    Console.WriteLine(message.SequenceNumber);
                    string messageBody = message.Body.ToString();
                    Console.WriteLine("Body: " + messageBody + "\n");
    
                    toastMessage = toastMessage.Replace("{messagepayload}", messageBody);
                    SendNotificationAsync(toastMessage);
    
                    // Remove message from subscription
                    await receiver.CompleteMessageAsync(message);
                }
                catch (Exception)
                {
                    // Indicate a problem, unlock message in subscription
                    await receiver.AbandonMessageAsync(message);
                }
            }
        }
    }
    static async void SendNotificationAsync(string message)
    {
        await hub.SendWindowsNativeNotificationAsync(message);
    }
    

    e. Pokud chcete tuto aplikaci publikovat jako webovou úlohu, klikněte pravým tlačítkem na řešení v sadě Visual Studio a vyberte Publikovat jako webovou úlohu.

    Screenshot of the right-click options being displayed with Publish as Azure WebJob outlined in red.

    f. Vyberte profil publikování a vytvořte nový web Azure, pokud ještě neexistuje, který hostuje tuto webovou úlohu a jakmile webový web poté publikujete.

    Screenshot showing the workflow to create a site on Azure.

    Snímek obrazovky s dialogovým oknem Publikovat web s vybranou možností Weby Microsoft Azure, zelenou šipkou ukazující na dialogové okno Vybrat existující web s červenou možností Nový a zelenou šipkou ukazující na dialogové okno Vytvořit web v Microsoft Azure s názvem webu a možnostmi Vytvořit červeně

    g. Nakonfigurujte úlohu tak, aby se při přihlášení k webu Azure Portal zobrazovala nějak takto:

    Screenshot of the Azure Portal with the enterprise push backend webjobs displayed and the Name, Schedule, and Logs values outlined in red.

  3. EnterprisePushMobileApp

    a. Tato aplikace je aplikace pro Windows Store, která přijímá informační zprávy z webové úlohy spuštěné jako součást back-endu Mobile a zobrazuje ji. Tento kód je založený na Notification Hubs – Univerzální kurz pro Windows.

    b. Ujistěte se, že je vaše aplikace povolená pro příjem informačních oznámení.

    c. Ujistěte se, že se při spuštění aplikace volá následující registrační kód notification Hubs (po nahrazení HubName hodnot a DefaultListenSharedAccessSignature hodnot):

    private async void InitNotificationsAsync()
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
        var hub = new NotificationHub("[HubName]", "[DefaultListenSharedAccessSignature]");
        var result = await hub.RegisterNativeAsync(channel.Uri);
    
        // Displays the registration ID so you know it was successful
        if (result.RegistrationId != null)
        {
            var dialog = new MessageDialog("Registration successful: " + result.RegistrationId);
            dialog.Commands.Add(new UICommand("OK"));
            await dialog.ShowAsync();
        }
    }
    

Spuštění ukázky

  1. Ujistěte se, že vaše webová úloha běží úspěšně a je naplánovaná tak, aby běžela nepřetržitě.

  2. Spusťte Aplikaci EnterprisePushMobileApp, která spustí aplikaci pro Windows Store.

  3. Spusťte konzolovou aplikaci EnterprisePushBackendSystem, která simuluje back-end LoB a začne odesílat zprávy a měla by se zobrazit informační zpráva, která se zobrazují jako na následujícím obrázku:

    Screenshot of a console running the Enterprise Push Backend System app and the message that is sent by the app.

  4. Zprávy byly původně odeslány do témat služby Service Bus, která byla sledována odběry služby Service Bus ve webové úloze. Po přijetí zprávy se vytvoří oznámení a odešle se do mobilní aplikace. Když přejdete na odkaz Protokoly protokolů webové úlohy pro vaši webovou úlohu, můžete se podívat na protokoly webové úlohy a potvrdit zpracování:

    Screenshot of the Continuous WebJob Details dialog box with the message that is sent outlined in red.