Wskazówki dotyczące architektury powiadomień wypychanych w przedsiębiorstwie
Obecnie przedsiębiorstwa stopniowo przechodzą w kierunku tworzenia aplikacji mobilnych dla użytkowników końcowych (zewnętrznych) lub pracowników (wewnętrznych). Mają istniejące systemy zaplecza, czyli komputery mainframe lub niektóre aplikacje loB, które muszą zostać zintegrowane z architekturą aplikacji mobilnych. W tym przewodniku omówiono, jak najlepiej wykonać tę integrację, zalecając możliwe rozwiązanie typowych scenariuszy.
Częstym wymaganiem jest wysyłanie powiadomień wypychanych do użytkowników za pośrednictwem aplikacji mobilnej, gdy w systemach zaplecza występuje zdarzenie zainteresowania. Na przykład klient bankowy, który ma aplikację bankową na urządzeniu i Telefon chce zostać powiadomiony, gdy zapłata jest wyższa niż określona kwota z konta lub intranetowego scenariusza, w którym pracownik działu finansowego, który ma aplikację zatwierdzania budżetu w systemie Windows Telefon chce zostać powiadomiony, gdy żądanie zatwierdzenia zostanie odebrane.
Przetwarzanie konta bankowego lub zatwierdzania prawdopodobnie zostanie przeprowadzone w niektórych systemach zaplecza, co wymaga zainicjowania wypychania do użytkownika. Może istnieć wiele takich systemów zaplecza, które muszą utworzyć ten sam rodzaj logiki, aby wypchnąć, gdy zdarzenie wyzwoli powiadomienie. Złożoność polega na zintegrowaniu kilku systemów zaplecza z jednym systemem wypychania, w którym użytkownicy końcowi mogli subskrybować różne powiadomienia, a nawet wiele aplikacji mobilnych. Na przykład intranetowe aplikacje mobilne, w których jedna aplikacja mobilna może chcieć otrzymywać powiadomienia z wielu takich systemów zaplecza. Systemy zaplecza nie wiedzą ani nie muszą wiedzieć o semantyce wypychania/technologii, więc typowym rozwiązaniem w tym miejscu tradycyjnie było wprowadzenie składnika, który sonduje systemy zaplecza pod kątem jakichkolwiek interesujących zdarzeń i jest odpowiedzialny za wysyłanie komunikatów wypychanych do klienta.
Lepszym rozwiązaniem jest użycie usługi Azure Service Bus — model tematu/subskrypcji, co zmniejsza złożoność przy jednoczesnym dokonaniu skalowalności rozwiązania.
Oto ogólna architektura rozwiązania (uogólniona z wieloma aplikacjami mobilnymi, ale równie odpowiednia, gdy istnieje tylko jedna aplikacja mobilna)
Architektura
Kluczowym elementem tego diagramu architektury jest usługa Azure Service Bus, która udostępnia model programowania tematów/subskrypcji (więcej informacji na ten temat można znaleźć w temacie Service Bus Pub/Sub programming). Odbiornik, który w tym przypadku, jest zapleczem mobilnym (zazwyczaj Azure Mobile Service, który inicjuje wypychanie do aplikacji mobilnych) nie odbiera komunikatów bezpośrednio z systemów zaplecza, ale zamiast tego pośredniej warstwy abstrakcji zapewnianej przez usługę Azure Service Bus, która umożliwia zapleczu mobilnemu odbieranie komunikatów z co najmniej jednego systemu zaplecza. Temat usługi Service Bus należy utworzyć dla każdego z systemów zaplecza, na przykład Account, HR, Finance, który jest w zasadzie "tematem" zainteresowania, co inicjuje wysyłanie komunikatów jako powiadomienie wypychane. Systemy zaplecza wysyłają komunikaty do tych tematów. Zaplecze mobilne może subskrybować co najmniej jeden z takich tematów, tworząc subskrypcję usługi Service Bus. Umożliwia ona zapleczu mobilnemu odbieranie powiadomienia z odpowiedniego systemu zaplecza. Zaplecze mobilne nadal nasłuchuje komunikatów w swoich subskrypcjach i gdy tylko pojawi się komunikat, cofa się i wysyła je jako powiadomienie do centrum powiadomień. Następnie centra powiadomień ostatecznie dostarczają komunikat do aplikacji mobilnej. Oto lista kluczowych składników:
- Systemy zaplecza (systemy LoB/Legacy)
- Tworzy temat usługi Service Bus
- Wysyła wiadomość
- Zaplecze mobilne
- Tworzy subskrypcję usługi
- Odbiera komunikat (z systemu zaplecza)
- Wysyła powiadomienia do klientów (za pośrednictwem usługi Azure Notification Hub)
- Aplikacja mobilna
- Odbiera i wyświetla powiadomienie
Świadczenia
- Rozdzielenie między odbiornikiem (aplikacją mobilną/usługą za pośrednictwem centrum powiadomień) i nadawcą (systemami zaplecza) umożliwia zintegrowanie dodatkowych systemów zaplecza z minimalną zmianą.
- Dzięki temu scenariusz wielu aplikacji mobilnych może odbierać zdarzenia z co najmniej jednego systemu zaplecza.
Przykład
Wymagania wstępne
Wykonaj poniższe samouczki, aby zapoznać się z pojęciami, a także typowymi krokami tworzenia i konfiguracji:
- Programowanie pub/sub usługi Service Bus — w tym samouczku wyjaśniono szczegóły pracy z tematami/subskrypcjami usługi Service Bus, jak utworzyć przestrzeń nazw zawierającą tematy/subskrypcje, jak wysyłać i odbierać komunikaty z nich.
- Usługa Notification Hubs — samouczek uniwersalny systemu Windows — w tym samouczku wyjaśniono, jak skonfigurować aplikację ze Sklepu Windows i używać usługi Notification Hubs do rejestrowania, a następnie odbierania powiadomień.
Przykładowy kod
Pełny przykładowy kod jest dostępny w sekcji Przykłady usługi Notification Hub. Jest on podzielony na trzy składniki:
EnterprisePushBackendSystem
a. Ten projekt używa pakietu NuGet Azure.Messaging.ServiceBus i jest oparty na programowaniu Pub/Sub usługi Service Bus.
b. Ta aplikacja to prosta aplikacja konsolowa w języku C#, która symuluje system LoB, który inicjuje komunikat, który ma zostać dostarczony do aplikacji mobilnej.
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
Służy do tworzenia tematu usługi 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
służy do wysyłania komunikatów do tego tematu usługi Service Bus. Ten kod po prostu wysyła zestaw losowych komunikatów do tematu okresowo na potrzeby przykładu. Zwykle istnieje system zaplecza, który wysyła komunikaty po wystąpieniu zdarzenia.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)); } }
ReceiveAndSendNotification
a. Ten projekt używa pakietów NuGet Azure.Messaging.ServiceBus i Microsoft.Web.WebJobs.Publish i jest oparty na programowaniu Pub/Sub usługi Service Bus.
b. Następująca aplikacja konsolowa jest uruchamiana jako zadanie WebJob platformy Azure, ponieważ musi ona stale nasłuchiwać komunikatów z systemów loB/zaplecza. Ta aplikacja jest częścią zaplecza mobilnego.
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
Służy do tworzenia subskrypcji usługi Service Bus dla tematu, w którym system zaplecza wysyła komunikaty. W zależności od scenariusza biznesowego ten składnik tworzy co najmniej jedną subskrypcję do odpowiednich tematów (na przykład niektóre mogą odbierać komunikaty z systemu kadr, niektóre z systemu finansowego itd.)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
Służy do odczytywania komunikatu z tematu przy użyciu jego subskrypcji, a jeśli odczyt zakończy się pomyślnie, utwórz powiadomienie (w przykładowym scenariuszu powiadomienie wyskakujące systemu Windows natywne powiadomienie) do wysłania do aplikacji mobilnej przy użyciu usługi 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. Aby opublikować tę aplikację jako zadania WebJob, kliknij prawym przyciskiem myszy rozwiązanie w programie Visual Studio i wybierz polecenie Publikuj jako zadania WebJob
f. Wybierz profil publikowania i utwórz nową witrynę Azure WebSite, jeśli jeszcze nie istnieje, która hostuje to polecenie WebJob, a następnie po utworzeniu witryny WebSite opublikuj.
Zrzut ekranu przedstawiający okno dialogowe Publikowanie w sieci Web z wybraną opcją Microsoft Azure Websites, zieloną strzałką wskazującą okno dialogowe Wybieranie istniejącej witryny internetowej z opcją Nowa na czerwono i zieloną strzałką wskazującą okno dialogowe Tworzenie witryny na platformie Microsoft Azure z nazwą witryny i opcjami Utwórz na czerwono.
g. Skonfiguruj zadanie tak, aby było uruchamiane w sposób ciągły, aby po zalogowaniu się do witryny Azure Portal zobaczyć coś podobnego do następującego:
EnterprisePushMobileApp
a. Ta aplikacja jest aplikacją ze Sklepu Windows, która odbiera wyskakujące powiadomienia z zadania WebJob uruchomionego w ramach zaplecza mobilnego i wyświetla je. Ten kod jest oparty na usłudze Notification Hubs — uniwersalny samouczek systemu Windows.
b. Upewnij się, że aplikacja jest włączona do odbierania wyskakujących powiadomień.
c. Upewnij się, że następujący kod rejestracji usługi Notification Hubs jest wywoływany podczas uruchamiania aplikacji (po zastąpieniu
HubName
wartości iDefaultListenSharedAccessSignature
: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(); } }
Uruchamianie przykładowej aplikacji
Upewnij się, że zadanie WebJob jest uruchomione pomyślnie i zaplanowane do ciągłego uruchamiania.
Uruchom aplikację EnterprisePushMobileApp, która uruchamia aplikację ze Sklepu Windows.
Uruchom aplikację konsolową EnterprisePushBackendSystem , która symuluje zaplecze loB i rozpoczyna wysyłanie komunikatów, a powiadomienia wyskakujące powinny być wyświetlane jak na poniższej ilustracji:
Komunikaty zostały pierwotnie wysłane do tematów usługi Service Bus, które były monitorowane przez subskrypcje usługi Service Bus w zadaniu sieci Web. Po odebraniu wiadomości powiadomienie zostało utworzone i wysłane do aplikacji mobilnej. Możesz przejrzeć dzienniki zadania WebJob, aby potwierdzić przetwarzanie po przejściu do linku Dzienniki w witrynie Azure Portal dla zadania internetowego: