Kurumsal gönderme mimari kılavuzu

Günümüzde kuruluşlar, son kullanıcıları (dış) veya çalışanlar (şirket içi) için mobil uygulamalar oluşturmaya yavaş yavaş devam etmektedir. Ana bilgisayarlar veya mobil uygulama mimarisiyle tümleştirilmesi gereken bazı LoB uygulamaları gibi mevcut arka uç sistemleri vardır. Bu kılavuzda, yaygın senaryolara olası çözüm önererek bu tümleştirmenin nasıl en iyi şekilde gerçekleştirilmesi hakkında bilgi verilmektedir.

Sık karşılaşılan bir gereksinim, arka uç sistemlerinde ilgi çekici bir olay oluştuğunda kullanıcılara mobil uygulamaları aracılığıyla anında iletme bildirimi göndermektir. Örneğin, i Telefon üzerinde bankanın bankacılık uygulamasına sahip bir banka müşterisi, windows Telefon bütçe onay uygulamasına sahip finans departmanı çalışanının onay isteği alındığında bildirim almak istediği hesaptan veya intranet senaryosundan belirli bir tutarın üzerinde bir ödeme yapıldığında bildirim almak ister.

Banka hesabı veya onay işleme, kullanıcıya gönderimi başlatması gereken bir arka uç sisteminde gerçekleştirilebilir. Bir olay bir bildirim tetiklediğinde göndermek için aynı mantık türünü oluşturması gereken bu tür birden çok arka uç sistemi olabilir. Buradaki karmaşıklık, son kullanıcıların farklı bildirimlere abone olabileceği ve hatta birden fazla mobil uygulama olabileceği tek bir gönderim sistemiyle birkaç arka uç sistemini tümleştirmektir. Örneğin, bir mobil uygulamanın bu tür birden çok arka uç sisteminden bildirim almak isteyebileceği intranet mobil uygulamaları. Arka uç sistemleri, itme semantiğini/teknolojisini bilmez veya bilmesi gerekmez, bu nedenle buradaki yaygın bir çözüm geleneksel olarak arka uç sistemlerini ilgilenilen olaylar için yoklayan ve istemciye gönderme iletilerini göndermekle sorumlu olan bir bileşen tanıtmaktır.

Daha iyi bir çözüm, çözümü ölçeklenebilir hale getirirken karmaşıklığı azaltan Azure Service Bus - Konu/Abonelik modelini kullanmaktır.

Çözümün genel mimarisi aşağıdadır (birden çok mobil uygulamayla genelleştirilmiştir, ancak yalnızca bir mobil uygulama olduğunda aynı şekilde uygulanabilir)

Mimari

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

Bu mimari diyagramın en önemli parçası, bir konu/abonelik programlama modeli sağlayan Azure Service Bus'tır (Service Bus Pub/Sub programlama bölümünde daha fazla bilgi sağlanır). Bu durumda alıcı, Mobil arka ucudur (genellikle mobil uygulamalara gönderim başlatan Azure Mobile Service), doğrudan arka uç sistemlerinden ileti almaz, bunun yerine Azure Service Bus tarafından sağlanan ve mobil arka ucun bir veya daha fazla arka uç sisteminden ileti almasını sağlayan bir ara soyutlama katmanıdır. Arka uç sistemlerinin her biri için temel olarak "ilgilenilen konular" olan ve anında iletme bildirimi olarak gönderilecek iletileri başlatan Hesap, İk, Finans gibi bir Service Bus Konusu oluşturulması gerekir. Arka uç sistemleri bu konulara ileti gönderir. Mobil Arka Uç, Service Bus aboneliği oluşturarak bir veya daha fazla konuya abone olabilir. Mobil arka ucun ilgili arka uç sisteminden bildirim almasını sağlar. Mobil arka uç, aboneliklerindeki iletileri dinlemeye devam eder ve bir ileti gelir gelmez geri döner ve bildirim hub'ına bildirim olarak gönderir. Bildirim hub'ları daha sonra iletiyi mobil uygulamaya teslim eder. Temel bileşenlerin listesi aşağıdadır:

  1. Arka uç sistemleri (LoB/Eski sistemler)
    • Service Bus Konusu Oluşturur
    • İleti Gönderir
  2. Mobil arka uç
    • Hizmet Aboneliği Oluşturur
    • İleti alır (Arka uç sisteminden)
    • İstemcilere bildirim gönderir (Azure Notification Hub aracılığıyla)
  3. Mobil Uygulama
    • Bildirim alır ve görüntüler

Sosyal haklar

  1. Alıcı (Notification Hub aracılığıyla mobil uygulama/hizmet) ile gönderen (arka uç sistemleri) arasındaki ayırma, ek arka uç sistemlerinin minimum değişiklikle tümleştirilmesini sağlar.
  2. Ayrıca, birden çok mobil uygulamanın bir veya daha fazla arka uç sisteminden olay alabilmesini de sağlar.

Örnek

Önkoşullar

Kavramları ve yaygın oluşturma ve yapılandırma adımlarını öğrenmek için aşağıdaki öğreticileri tamamlayın:

  1. Service Bus Pub/Sub programlaması - Bu öğreticide Service Bus Konuları/Abonelikleri ile çalışmanın ayrıntıları, konuları/abonelikleri içerecek bir ad alanı oluşturma, onlardan ileti gönderme ve alma işlemleri açıklanmaktadır.
  2. Notification Hubs - Windows Evrensel öğreticisi - Bu öğreticide bir Windows Mağazası uygulamasını ayarlama ve Notification Hubs kullanarak kaydolma ve bildirim alma işlemleri açıklanmaktadır.

Örnek kod

Tam örnek kodu Notification Hub Örnekleri'nde bulabilirsiniz. Üç bileşene ayrılır:

  1. EnterprisePushBackendSystem

    a. Bu proje Azure.Messaging.ServiceBus NuGet paketini kullanır ve Service Bus Pub/Sub programlamasını temel alır.

    b. Bu uygulama, mobil uygulamaya teslim edilecek iletiyi başlatan bir LoB sisteminin benzetimini yapmak için basit bir C# konsol uygulamasıdır.

    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 , Service Bus konusunu oluşturmak için kullanılır.

    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 , iletileri bu Service Bus Konusuna göndermek için kullanılır. Bu kod, örneğin amacı doğrultusunda belirli aralıklarla konuya rastgele bir ileti kümesi gönderir. Normalde, bir olay gerçekleştiğinde ileti gönderen bir arka uç sistemi vardır.

    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. Bu proje, Azure.Messaging.ServiceBus ve Microsoft.Web.WebJobs.Publish NuGet paketlerini kullanır ve Service Bus Pub/Sub programlamasını temel alır.

    b. Aşağıdaki konsol uygulaması, LoB/arka uç sistemlerinden gelen iletileri dinlemek için sürekli çalışması gerektiğinden Azure Web İşi olarak çalışır. Bu uygulama Mobil arka ucunuzun bir parçasıdır.

    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 , arka uç sisteminin ileti gönderdiği konu için bir Service Bus aboneliği oluşturmak için kullanılır. İş senaryosuna bağlı olarak, bu bileşen ilgili konular için bir veya daha fazla abonelik oluşturur (örneğin, bazıları İk sisteminden, bazıları Finans sisteminden vb. ileti alıyor olabilir)

    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 aboneliğini kullanarak konu başlığındaki iletiyi okumak için kullanılır ve okuma başarılı olursa Azure Notification Hubs kullanılarak mobil uygulamaya gönderilecek bir bildirim (örnek senaryoda bir Windows yerel bildirim bildirimi) oluşturun.

    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. Bu uygulamayı Web İşi olarak yayımlamak için Visual Studio'da çözüme sağ tıklayın ve Web İşi Olarak Yayımla'yı seçin

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

    f. Yayımlama profilinizi seçin ve henüz yoksa yeni bir Azure Web Sitesi oluşturun; bu Web İşi'ni barındırır ve Web Sitesi'ni aldıktan sonra Yayımla'yı seçin.

    Screenshot showing the workflow to create a site on Azure.

    Microsoft Azure Web Siteleri seçeneğinin seçili olduğu Web'i Yayımla iletişim kutusunun ekran görüntüsü, Yeni seçeneği kırmızıyla vurgulanmış Mevcut Web Sitesini Seç iletişim kutusunu gösteren yeşil bir ok ve Site adı ve Oluşturma seçenekleri kırmızıyla vurgulanmış Microsoft Azure'da site oluştur iletişim kutusunu işaret eden yeşil bir ok.

    r. azure portalında oturum açtığınızda aşağıdakine benzer bir şey görmeniz için işi "Sürekli Çalıştır" olarak yapılandırın:

    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. Bu uygulama, Mobil arka ucunuzun bir parçası olarak çalışan Web İşinden bildirim alan ve görüntüleyen bir Windows Mağazası uygulamasıdır. Bu kod Notification Hubs - Windows Evrensel öğreticisini temel alır.

    b. Uygulamanızın bildirim almak için etkinleştirildiğinden emin olun.

    c. Uygulama başlangıcında aşağıdaki Notification Hubs kayıt kodunun çağrıldığından emin olun (ve DefaultListenSharedAccessSignature değerlerini değiştirdikten HubName sonra:

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

Örneği çalıştırma

  1. Web işinizin başarıyla çalıştığından ve sürekli çalışacak şekilde zamanlandığından emin olun.

  2. Windows Mağazası uygulamasını başlatan EnterprisePushMobileApp'i çalıştırın.

  3. LoB arka ucu benzetimini yapan ve ileti göndermeye başlayan EnterprisePushBackendSystem konsol uygulamasını çalıştırın ve aşağıdaki görüntüde gösterildiği gibi bildirim bildirimleri görmeniz gerekir:

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

  4. İletiler başlangıçta Web İşinizdeki Service Bus abonelikleri tarafından izlenen Service Bus konularına gönderildi. İleti alındıktan sonra bir bildirim oluşturulur ve mobil uygulamaya gönderilir. Web İşinizin Azure portalındaki Günlükler bağlantısına gittiğinizde işlemeyi onaylamak için Web İşi günlüklerine bakabilirsiniz:

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