Anleitung für eine unternehmensbezogene PusharchitekturEnterprise push architectural guidance

Unternehmen gehen mehr und mehr dazu über, mobile Anwendungen entweder für ihre Endbenutzer (extern) oder für ihre Mitarbeiter (intern) zu erstellen.Enterprises today are gradually moving towards creating mobile applications for either their end users (external) or for the employees (internal). Sie verfügen über Back-End-Systeme – beispielsweise Mainframecomputer oder Branchenanwendungen –, die in die Architektur der mobilen Anwendungen integriert werden müssen.They have existing backend systems in place be it mainframes or some LoB applications, which must be integrated into the mobile application architecture. Dieser Leitfaden zeigt, wie sich diese Integration am besten umsetzen lässt, und empfiehlt mögliche Lösungen für allgemeine Szenarien.This guide talks about how best to do this integration recommending possible solution to common scenarios.

Eine häufige Anforderung besteht darin, Pushbenachrichtigung an die Benutzer über deren mobile Anwendung zu senden, wenn in den Back-End-Systemen ein interessierendes Ereignis auftritt.A frequent requirement is for sending push notification to the users through their mobile application when an event of interest occurs in the backend systems. Ein Beispiel: Eine Bankkundin, die die Banking-App ihrer Bank auf ihrem iPhone installiert hat, möchte benachrichtigt werden, wenn ihr Konto mit einem Betrag belastet wird, der über eine bestimmte Summe hinausgeht. Ein anderes Beispiel ist ein Intranetszenario, in dem ein Mitarbeiter aus der Finanzabteilung, der auf seinem Windows Phone über eine App zur Budgetgenehmigung verfügt, benachrichtigt werden möchte, wenn er eine Genehmigungsanforderung erhält.For example, a bank customer who has the bank's banking app on an iPhone wants to be notified when a debit is made above a certain amount from the account or an intranet scenario where an employee from finance department who has a budget approval app on a Windows Phone wants to be notified when the approval request is received.

Die Bankkonto- oder Genehmigungsverarbeitung erfolgt wahrscheinlich in einem Back-End-System, das ein Pushbenachrichtigung an den Benutzer auslösen muss.The bank account or approval processing is likely to be done in some backend system, which must initiate a push to the user. Möglicherweise gibt es mehrere solcher Back-End-Systeme, die alle die gleiche Logik für Pushbenachrichtigungen verwenden müssen, wenn ein Ereignis eine Benachrichtigung auslöst.There may be multiple such backend systems, which must all build the same kind of logic to push when an event triggers a notification. Die Komplexität besteht hier darin, dass mehrere Back-End-Systeme in ein einziges Pushsystem integriert werden müssen, in dem die Endbenutzer möglicherweise unterschiedliche Benachrichtigungen abonniert haben. Möglicherweise gibt es sogar mehrere mobile Anwendungen.The complexity here lies in integrating several backend systems together with a single push system where the end users may have subscribed to different notifications and there may even be multiple mobile applications. Ein Beispiel hierfür sind mobile Intranetumgebungen, in denen eine einzige mobile Anwendung Benachrichtigungen von mehreren solcher Back-End-Systeme empfangen soll.For example, intranet mobile apps where one mobile application may want to receive notifications from multiple such backend systems. Die Back-End-Systeme haben keinerlei Kenntnis der Pushsemantik oder Pushtechnologie, also besteht eine häufige herkömmliche Lösung darin, eine Komponente bereitzustellen, die die Back-End-Systeme ständig nach Ereignissen von Interesse abfragt und dafür zuständig ist, die Pushnachrichten an die Clients zu senden.The backend systems do not know or need to know of push semantics/technology so a common solution here traditionally has been to introduce a component, which polls the backend systems for any events of interest and is responsible for sending the push messages to the client.

Eine bessere Lösung ist das Modell „Azure Service Bus – Thema/Abonnement“, das die Komplexität reduziert und gleichzeitig die Lösung skalierbar gestaltet.A better solution is to use Azure Service Bus - Topic/Subscription model, which reduces the complexity while making the solution scalable.

Die allgemeine Architektur der Lösung (verallgemeinert mit mehreren mobilen Apps, jedoch gleichermaßen anwendbar, wenn es nur eine mobile App gibt) sieht wie folgt aus.Here is the general architecture of the solution (generalized with multiple mobile apps but equally applicable when there is only one mobile app)

AufbauArchitecture

Diagramm der Unternehmensarchitektur mit dem Flow durch Ereignisse, Abonnements und Pushnachrichten.

Kernstück dieses Architekturdiagramms ist der Dienst Azure Service Bus, der ein auf Themen und Abonnements basierendes Programmiermodell bereitstellt (mehr dazu erfahren Sie unter WindowsAzure.ServiceBus).The key piece in this architectural diagram is Azure Service Bus, which provides a topics/subscriptions programming model (more on it at Service Bus Pub/Sub programming). Der Empfänger, bei dem es sich in diesem Fall um das mobile Back-End handelt (üblicherweise Azure Mobile Service zum Auslösen einer Pushbenachrichtigung an die mobilen Apps), erhält Nachrichten nicht direkt von den Back-End-Systemen, sondern von einer dazwischen liegenden Abstraktionsschicht. Diese wird von Azure Service Bus bereitgestellt und ermöglicht es den mobilen Back-End-Systemen, Nachrichten von einem oder mehreren Back-End-Systemen zu empfangen.The receiver, which in this case, is the Mobile backend (typically Azure Mobile Service, which initiates a push to the mobile apps) does not receive messages directly from the backend systems but instead, an intermediate abstraction layer provided by Azure Service Bus, which enables mobile backend to receive messages from one or more backend systems. Für jedes der Back-End-Systeme, z.B. für Abrechnung, Personalwesen oder Finanzen, muss ein Service Bus-Thema erstellt werden. Bei diesen Systemen handelt es sich im Grunde um „Themen von Interesse“, die bewirken, dass Nachrichten als Pushbenachrichtigungen gesendet werden.A Service Bus Topic needs to be created for each of the backend systems, for example, Account, HR, Finance, which is basically "topics" of interest, which initiates messages to be sent as push notification. Die Back-End-Systeme senden Nachrichten an diese Themen.The backend systems send messages to these topics. Ein Mobil-Back-End kann eines oder mehrere solcher Themen durch Erstellen eines Service Bus-Abonnements abonnieren.A Mobile Backend can subscribe to one or more such topics by creating a Service Bus subscription. Dadurch erhält das mobile Back-End die Berechtigung, eine Benachrichtigung vom entsprechenden Back-End-System zu empfangen.It entitles the mobile backend to receive a notification from the corresponding backend system. Das Mobil-Back-End lauscht weiterhin auf Nachrichten in seinen Abonnements, und sobald eine Nachricht eingetroffen ist, sendet es diese als Benachrichtigung an seinen Benachrichtigungshub.Mobile backend continues to listen for messages on their subscriptions and as soon as a message arrives, it turns back and sends it as notification to its notification hub. Notification Hubs senden die Nachricht dann schließlich an die mobile App.Notification hubs then eventually deliver the message to the mobile app. Hier finden Sie die Liste der wichtigsten Komponenten:Here is the list of key components:

  1. Back-End-System (Branchen- oder Legacysystem)Backend systems (LoB/Legacy systems)
    • Erstellt Service Bus-ThemenCreates Service Bus Topic
    • Sendet NachrichtenSends Message
  2. Mobil-Back-EndMobile backend
    • Erstellt dienstbezogene AbonnementsCreates Service Subscription
    • Empfängt Nachrichten (von Back-End-System)Receives Message (from Backend system)
    • Sendet Benachrichtigungen an Clients (über Azure-Benachrichtigungshub)Sends notification to clients (via Azure Notification Hub)
  3. Mobile AnwendungMobile Application
    • Empfängt Benachrichtigungen und zeigt diese anReceives and display notification

VorteileBenefits

  1. Die Entkopplung von Empfänger (mobile App/mobiler Dienst über Benachrichtigunghub) und Sender (Back-End-Systeme) ermöglicht es, zusätzliche Back-End-Systeme bei minimalen Änderungen zu integrieren.The decoupling between the receiver (mobile app/service via Notification Hub) and sender (backend systems) enables additional backend systems being integrated with minimal change.
  2. Hiermit lassen sich auch Szenarios umsetzen, in denen mehrere mobile Apps in der Lage sind, Ereignisse von mehreren Back-End-Systemen zu empfangen.It also makes the scenario of multiple mobile apps being able to receive events from one or more backend systems.

BeispielSample

VoraussetzungenPrerequisites

Arbeiten Sie die folgenden Tutorials durch, um sich mit den Konzepten sowie den allgemeinen Erstellungs- und Konfigurationsschritten vertraut zu machen:Complete the following tutorials to familiarize with the concepts as well as common creation & configuration steps:

  1. WindowsAzure.ServiceBus: Dieses Tutorial bietet Informationen zum Verwenden von Service Bus-Themen und -Abonnements, zum Erstellen eines Namespace, der Themen und Abonnements enthält, und zum Senden und Empfangen von Nachrichten an und von Themen und Abonnements.Service Bus Pub/Sub programming - This tutorial explains the details of working with Service Bus Topics/Subscriptions, how to create a namespace to contain topics/subscriptions, how to send & receive messages from them.
  2. Erste Schritte mit Notification Hubs: Dieses Tutorial erläutert, wie Sie eine Windows Store-App einrichten und wie Sie Notification Hubs verwenden, um sich für Benachrichtigungen zu registrieren und diese zu empfangen.Notification Hubs - Windows Universal tutorial - This tutorial explains how to set up a Windows Store app and use Notification Hubs to register and then receive notifications.

BeispielcodeSample code

Der vollständige Beispielcode ist unter Notification Hubs Samples verfügbar.The full sample code is available at Notification Hub Samples. Der Code ist in drei Komponenten aufgeteilt:It is split into three components:

  1. EnterprisePushBackendSystemEnterprisePushBackendSystem

    a.a. Dieses Projekt verwendet das NuGet-Paket WindowsAzure.ServiceBus und basiert auf WindowsAzure.ServiceBus.This project uses the WindowsAzure.ServiceBus NuGet package and is based on Service Bus Pub/Sub programming.

    b.b. Bei der Anwendung handelt es sich um eine einfache C#-Konsolen-App zum Simulieren eines Branchensystems, mit dem das Senden einer Nachricht an eine mobile App veranlasst wird.This application is a simple C# console app to simulate an LoB system, which initiates the message to be delivered to the mobile app.

    static void Main(string[] args)
    {
        string connectionString =
            CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
    
        // Create the topic
        CreateTopic(connectionString);
    
        // Send message
        SendMessage(connectionString);
    }
    

    c.c. CreateTopic wird zum Erstellen des Service Bus-Themas verwendet.CreateTopic is used to create the Service Bus topic.

    public static void CreateTopic(string connectionString)
    {
        // Create the topic if it does not exist already
    
        var namespaceManager =
            NamespaceManager.CreateFromConnectionString(connectionString);
    
        if (!namespaceManager.TopicExists(sampleTopic))
        {
            namespaceManager.CreateTopic(sampleTopic);
        }
    }
    

    d.d. SendMessage wird verwendet, um die Nachrichten an dieses Service Bus-Thema zu senden.SendMessage is used to send the messages to this Service Bus Topic. Dieser Code sendet für dieses Beispiel einfach regelmäßig einen Satz von zufälligen Nachrichten an das Thema.This code simply sends a set of random messages to the topic periodically for the purpose of the sample. Normalerweise ist ein Back-End-System vorhanden, das die Nachrichten sendet, wenn ein Ereignis auftritt.Normally there is a backend system, which sends messages when an event occurs.

    public static void SendMessage(string connectionString)
    {
        TopicClient client =
            TopicClient.CreateFromConnectionString(connectionString, sampleTopic);
    
        // 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
            BrokeredMessage message = new BrokeredMessage(notification);
            client.Send(message);
    
            Console.WriteLine("{0} Message sent - '{1}'", DateTime.Now, notification);
    
            System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10));
        }
    }
    
  2. ReceiveAndSendNotificationReceiveAndSendNotification

    a.a. Dieses Projekt verwendet die NuGet-Pakete WindowsAzure.ServiceBus und Microsoft.Web.WebJobs.Publish und basiert auf WindowsAzure.ServiceBus.This project uses the WindowsAzure.ServiceBus and Microsoft.Web.WebJobs.Publish NuGet packages and is based on Service Bus Pub/Sub programming.

    b.b. Die folgende Konsolen-App ist als Azure WebJob implementiert, weil sie kontinuierlich ausgeführt werden muss, um auf Nachrichten aus den Branchen- bzw. Back-End-Systemen zu lauschen.The following console app runs as an Azure WebJob since it has to run continuously to listen for messages from the LoB/backend systems. Diese Anwendung ist Teil Ihres mobilen Back-Ends.This application is part of your Mobile backend.

    static void Main(string[] args)
    {
        string connectionString =
                 CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
    
        // Create the subscription that receives messages
        CreateSubscription(connectionString);
    
        // Receive message
        ReceiveMessageAndSendNotification(connectionString);
    }
    

    c.c. CreateSubscription wird zum Erstellen eines Service Bus-Abonnements für das Thema verwendet, an das das Back-End-System Nachrichten sendet.CreateSubscription is used to create a Service Bus subscription for the topic where the backend system sends messages. Je nach Geschäftsszenario erstellt diese Komponente mindestens ein Abonnement für die jeweiligen Themen (z.B. empfangen einige Themen Nachrichten aus dem Personalsystem, einige aus dem Finanzsystem usw.).Depending on the business scenario, this component creates one or more subscriptions to corresponding topics (for example, some may be receiving messages from HR system, some from Finance system, and so on)

    static void CreateSubscription(string connectionString)
    {
        // Create the subscription if it does not exist already
        var namespaceManager =
            NamespaceManager.CreateFromConnectionString(connectionString);
    
        if (!namespaceManager.SubscriptionExists(sampleTopic, sampleSubscription))
        {
            namespaceManager.CreateSubscription(sampleTopic, sampleSubscription);
        }
    }
    

    d.d. ReceiveMessageAndSendNotification wird verwendet, um die Nachricht über das dazugehörige Abonnement aus dem Thema zu lesen und, wenn der Lesevorgang erfolgreich war, eine Benachrichtigung zu erstellen (im Beispielszenario eine native Windows-Popupbenachrichtigung), die über Azure Notification Hubs an die mobile Anwendung gesendet werden soll.ReceiveMessageAndSendNotification is used to read the message from the topic using its subscription and if the read is successful then craft a notification (in the sample scenario a Windows native toast notification) to be sent to the mobile application using Azure Notification Hubs.

    static void ReceiveMessageAndSendNotification(string connectionString)
    {
        // Initialize the Notification Hub
        string hubConnectionString = CloudConfigurationManager.GetSetting
                ("Microsoft.NotificationHub.ConnectionString");
        hub = NotificationHubClient.CreateClientFromConnectionString
                (hubConnectionString, "enterprisepushservicehub");
    
        SubscriptionClient Client =
            SubscriptionClient.CreateFromConnectionString
                    (connectionString, sampleTopic, sampleSubscription);
    
        Client.Receive();
    
        // Continuously process messages received from the subscription
        while (true)
        {
            BrokeredMessage message = Client.Receive();
            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.GetBody<string>();
                    Console.WriteLine("Body: " + messageBody + "\n");
    
                    toastMessage = toastMessage.Replace("{messagepayload}", messageBody);
                    SendNotificationAsync(toastMessage);
    
                    // Remove message from subscription
                    message.Complete();
                }
                catch (Exception)
                {
                    // Indicate a problem, unlock message in subscription
                    message.Abandon();
                }
            }
        }
    }
    static async void SendNotificationAsync(string message)
    {
        await hub.SendWindowsNativeNotificationAsync(message);
    }
    

    e.e. Um diese App als WebJob zu veröffentlichen, klicken Sie in Visual Studio mit der rechten Maustaste auf die Projektmappe, und wählen Sie Als WebJob veröffentlichen aus.For publishing this app as a WebJob, right click on the solution in Visual Studio and select Publish as WebJob

    Screenshot der Optionen, die nach einem Klick mit der rechten Maustaste angezeigt werden, „Als Azure-WebJob veröffentlichen“ ist rot umrandet.

    f.f. Wählen Sie Ihr Veröffentlichungsprofil aus, und erstellen Sie eine neue Azure-Website, sofern noch keine vorhanden ist, die diesen WebJob hostet. Sobald die Website vorhanden ist, klicken Sie auf Veröffentlichen.Select your publishing profile and create a new Azure WebSite if it does not exist already, which hosts this WebJob and once you have the WebSite then Publish.

    Screenshot des Workflows zum Erstellen einer Website in Azure.

    Screenshot des Dialogfelds „Web veröffentlichen“ mit ausgewählter Option „Microsoft Azure-Websites“. Ein grüner Pfeil zeigt auf das Dialogfeld „Vorhandene Website auswählen“, in dem die Option „Neu“ rot umrandet ist. Ein weiterer grüner Pfeil zeigt auf das Dialogfeld „Website in Microsoft Azure erstellen“, in dem die Optionen „Websitename“ und „Erstellen“ rot umrandet sind.Screenshot of the Publish Web dialog box with the Microsoft Azure Websites option selected, a green arrow pointing to the Select Existing Website dialog box with the New option outlined in red, and a green arrow pointing to the Create site on Microsoft Azure dialog box with the Site name and Create options outlined in red.

    g.g. Konfigurieren Sie den WebJob mit „Dauerhaft ausführen“, sodass in etwa Folgendes angezeigt wird, wenn Sie sich beim Azure portal angemeldet haben:Configure the job to be "Run Continuously" so that when you log in to the Azure portal you should see something like the following:

    Screenshot des Azure-Portals, in dem die Webaufträge für „enterprisepushbackend“ angezeigt werden und die Werte für den Namen, den Zeitplan und die Protokolle rot umrandet sind.

  3. EnterprisePushMobileAppEnterprisePushMobileApp

    a.a. Dies ist eine Windows Store-Anwendung, die Popupbenachrichtigungen von dem WebJob empfängt, der als Teil Ihres mobilen Back-Ends ausgeführt wird, und diese Benachrichtigungen anzeigt.This application is a Windows Store application, which receives toast notifications from the WebJob running as part of your Mobile backend and display it. Dieser Code basiert auf Erste Schritte mit Notification Hubs.This code is based on Notification Hubs - Windows Universal tutorial.

    b.b. Stellen Sie sicher, dass Ihre Anwendung so konfiguriert ist, dass sie Popupbenachrichtigungen empfangen kann.Ensure that your application is enabled to receive toast notifications.

    c.c. Stellen Sie sicher, dass der folgende Notification Hubs-Registrierungscode beim App-Start aufgerufen wird (nachdem HubName und DefaultListenSharedAccessSignature ersetzt wurden):Ensure that the following Notification Hubs registration code is being called at the App start up (after replacing the HubName and DefaultListenSharedAccessSignature values:

    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();
        }
    }
    

Ausführen des BeispielsRunning the sample

  1. Stellen Sie sicher, dass Ihr WebJob erfolgreich ausgeführt wird und für die kontinuierliche Ausführung geplant ist.Ensure that your WebJob is running successfully and scheduled to run continuously.

  2. Führen Sie die EnterprisePushMobileApp aus, mit der die Windows Store-App gestartet wird.Run the EnterprisePushMobileApp, which starts the Windows Store app.

  3. Führen Sie die Konsolenanwendung EnterprisePushBackendSystem aus, die das Branchen-Back-End simuliert und damit beginnt, Nachrichten zu senden. Es sollten Popupbenachrichtigungen ähnlich der folgenden angezeigt werden:Run the EnterprisePushBackendSystem console application, which simulates the LoB backend and starts sending messages and you should see toast notifications appearing like the following image:

    Screenshot einer Konsole mit ausgeführter App „EnterprisePushBackendSystem“ und der Nachricht, die von der App gesendet wird.

  4. Die Nachrichten wurden ursprünglich an Service Bus-Themen gesendet, die von Service Bus-Abonnements in Ihrem WebJob überwacht wurden.The messages were originally sent to Service Bus topics, which was being monitored by Service Bus subscriptions in your Web Job. Sobald eine Nachricht empfangen wurde, wurde eine Benachrichtigung erstellt und an die mobile App gesendet.Once a message was received, a notification was created and sent to the mobile app. Sie können die WebJob-Protokolle durchsuchen, um die Verarbeitung zu bestätigen. Navigieren Sie dazu im Azure portal für Ihren WebJob zum Link „Protokolle“:You can look through the WebJob logs to confirm the processing when you go to the Logs link in Azure portal for your Web Job:

    Screenshot des Dialogfelds „Kontinuierlicher WebJob“, in dem die gesendete Nachricht rot umrandet ist.