Bagikan melalui


Panduan arsitektur push enterprise

Saat ini, banyak perusahaan yang secara bertahap mulai membuat aplikasi seluler untuk pengguna akhir (eksternal) mau pun untuk karyawannya (internal). Semua perusahaan ini memiliki sistem backend yang terpasang pada mainframe atau beberapa aplikasi LoB dan harus diintegrasikan ke dalam arsitektur aplikasi seluler. Panduan ini memberikan informasi tentang cara terbaik untuk melakukan integrasi dengan rekomendasi solusi yang dapat digunakan dalam beberapa skenario umum.

Persyaratan yang sering diminta adalah untuk mengirim pemberitahuan push kepada pengguna melalui aplikasi seluler mereka ketika ada kejadian penting di dalam sistem backend. Misalnya, pelanggan bank yang memiliki aplikasi perbankan di iPhone ingin mendapatkan pemberitahuan ketika terjadi transaksi debit di atas jumlah tertentu dari akunnya atau skenario intranet saat karyawan dari departemen keuangan yang memiliki aplikasi persetujuan anggaran pada Windows Phone ingin mendapatkan pemberitahuan ketika permintaan persetujuan diterima.

Pemrosesan rekening bank atau persetujuan mungkin akan dilakukan dalam beberapa sistem backend, yang mengharuskan sistem ini memulai push (pendorongan) kepada pengguna. Mungkin ada beberapa sistem backend yang harus membangun jenis logika yang sama untuk mendorong ketika satu peristiwa memicu pemberitahuan. Kompleksitas di sini terletak pada integrasi beberapa sistem backend dengan sistem pendorongan tunggal ketika pengguna akhir mungkin telah berlangganan pemberitahuan yang berbeda dan bahkan mungkin mempunyai beberapa aplikasi seluler. Misalnya, aplikasi seluler intranet di manasatu aplikasi seluler yang mungkin dapat menerima pemberitahuan dari beberapa sistem backend tersebut. Sistem backend tidak tahu atau tidak perlu tahu tentang semantik /teknologi push, jadi solusi umum di sini secara tradisional telah memperkenalkan komponen yang memeriksa status pada sistem backend untuk setiap peristiwa penting dan bertanggung jawab untuk mengirim pesan push kepada klien.

Solusi yang lebih baik adalah menggunakan Topik/Model langganan - Azure Service Bus, yang dapat mengurangi kompleksitas sekaligus membuat solusi secara terukur.

Berikut adalah arsitektur umum solusi (secara umum dapat digunakan untuk beberapa aplikasi seluler sekaligus, tetapi berlaku juga ketika hanya ada satu aplikasi seluler)

Arsitektur

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

Bagian kunci dalam diagram arsitektur ini adalah Azure Service Bus, yang menyediakan topik/model pemrograman langganan (lihat lebih lanjut pada pemrograman Azure Service Bus Pub/Sub. Penerima, yaitu Backend seluler (biasanya Azure Mobile Service, yang memulai pendorongan ke aplikasi seluler) tidak menerima pesan langsung dari sistem backend, tetapi melalui lapisan abstraksi perantara yang disediakan oleh Azure Service Bus sehingga memungkinkan backend seluler untuk menerima pesan dari satu sistem backend atau lebih. Topik Bus Layanan perlu dibuat untuk setiap sistem backend, misalnya, Akun, SDM, Keuangan, yang pada dasarnya adalah "topik" yang menarik, yang memulai pesan untuk dikirim sebagai pemberitahuan push. Sistem backend mengirim pesan ke topik ini. Backend Seluler dapat berlangganan ke satu atau beberapa topik tersebut dengan membuat langganan pada Azure Service Bus. Langganan ini memungkinkan backend seluler menerima pemberitahuan dari sistem backend yang sesuai. Backend seluler terus-menerus mendengarkan pesan pada langganan mereka dan segera setelah pesan diterima, pesan akan dikembalikan dan dikirimkan sebagai pemberitahuan ke hub pemberitahuannya. Hub pemberitahuan nantinya akan mengirimkan pesan ke aplikasi seluler. Berikut adalah daftar komponen utama:

  1. Sistem backend (sistem LoB/Warisan)
    • Membuat Topik Microsoft Azure Service Bus
    • Mengirim Pesan
  2. Backend seluler
    • Membuat Langganan Layanan
    • Menerima Pesan (dari sistem Backend)
    • Mengirim pemberitahuan ke klien (melalui Hub Pemberitahuan Azure)
  3. Aplikasi Seluler
    • Menerima dan menampilkan pemberitahuan

Keuntungan

  1. Pemisahan antara penerima (aplikasi seluler/layanan melalui Hub Pemberitahuan) dan pengirim (sistem backend) memungkinkan sistem backend tambahan berintegrasi dengan perubahan minimal.
  2. Pemisahan ini juga membuat skenario beberapa aplikasi seluler dapat menerima peristiwa dari satu sistem backend atau lebih.

Sampel

Prasyarat

Pelajari tutorial berikut secara lengkap untuk memahami konsep beserta langkah-langkah pembuatan umum dan konfigurasi:

  1. Pemrograman Azure Service Bus Pub/Sub - Tutorial ini menjelaskan detail cara kerja Topik/Langganan Azure Service Bus, cara membuat kumpulan nama XML yang berisi topik/langganan, serta cara mengirim & menerima pesan dari topik/langganan.
  2. Microsoft Azure Notification Hubs - Tutorial Universal Windows - Tutorial ini menjelaskan cara menyiapkan aplikasi Windows Microsoft Store dan menggunakan Microsoft Azure Notification Hubs untuk mendaftar dan nantinya menerima pemberitahuan.

Kode Sampel

Kode sampel lengkap tersedia di Sampel Hub Pemberitahuan. Kode sampel ini dibagi menjadi tiga komponen:

  1. EnterprisePushBackendSystem

    a. Proyek ini menggunakan paket NuGet Azure.Messaging.ServiceBus dan berdasarkan pada pemrograman Azure Service Bus Pub/Sub.

    b. Aplikasi ini adalah aplikasi konsol C# sederhana untuk menyimulasikan sistem LoB dan membuat pesan terkirim ke aplikasi seluler.

    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 digunakan untuk membuat topik Microsoft Azure 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 digunakan untuk mengirim pesan ke Topik Azure Service Bus ini. Kode ini hanya mengirim satu set pesan acak ke topik secara berkala untuk keperluan sampel. Umumnya, terdapat sistem backend yang akan mengirim pesan ketika terjadi peristiwa.

    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. Proyek ini menggunakan paket NuGet Azure.Messaging.ServiceBus dan Microsoft.Web.WebJobs.Publish, berdasarkan pada pemrograman Azure Service Bus Pub/Sub.

    b. Aplikasi konsol berikut dieksekusi sebagai Azure WebJob karena harus berjalan secara berkelanjutan untuk mendengarkan pesan dari sistem LoB / backend. Aplikasi ini adalah bagian dari Backend seluler Anda.

    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 digunakan untuk membuat langganan Azure Service Bus untuk topik tempat sistem backend mengirim pesan. Tergantung pada skenario bisnisnya, komponen ini membuat satu atau lebih langganan ke topik yang sesuai (misalnya, beberapa mungkin menerima pesan dari sistem SDM, beberapa dari sistem Keuangan, dan sebagainya)

    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 digunakan untuk membaca pesan dari topik menggunakan langganannya dan jika bacaan berhasil kemudian membuat pemberitahuan (dalam skenario sampel pemberitahuan toast asli Windows) untuk dikirim ke aplikasi seluler menggunakan Microsoft 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. Untuk menerbitkan aplikasi ini sebagai WebJob,klik kanan pada solusi di Visual Studio dan pilih Terbitkan sebagai WebJob

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

    f. Pilih profil penerbitan Anda dan buat Azure WebSite baru, jika belum ada, untuk yang akan menghosting WebJob ini dan setelah Anda memiliki Situs Web, lalu Terbitkan.

    Screenshot showing the workflow to create a site on Azure.

    Cuplikan layar kotak dialog Terbitkan Web dengan opsi Situs Web Microsoft Azure dipilih, panah hijau yang menunjuk ke kotak dialog Pilih Situs Web yang Sudah Ada dengan opsi Baru dioutline merah, dan panah hijau menunjuk ke kotak dialog Buat situs web pada Microsoft Azure dengan Nama situs dan Buat opsi dioutline merah.

    g. Mengonfigurasi tugas dengan "Jalankan Secara Berkelanjutan" sehingga ketika Anda masuk ke portal Microsoft Azure, Anda akan melihat hal-hal berikut ini:

    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. Aplikasi ini adalah aplikasi Windows Microsoft Store yang menerima pemberitahuan toast dari WebJob yang berjalan sebagai bagian dari backend Mobile Anda dan menampilkannya. Kode ini berdasarkan pada Microsoft Azure Notification Hubs - Tutorial Universal Windows.

    b. Pastikan aplikasi Anda aktif untuk menerima pemberitahuan toast.

    c. Pastikan bahwa kode pendaftaran Microsoft Azure Notification Hubs berikut dipanggil ketika memulai Aplikasi (setelah mengganti nilai HubName dan DefaultListenSharedAccessSignature:

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

Menjalankan sampel

  1. Pastikan WebJob Anda berjalan dengan sukses dan terjadwal secara berkelanjutan.

  2. Jalankan EnterprisePushMobileApp, yang memulai aplikasi Windows Store.

  3. Jalankan aplikasi konsol EnterprisePushBackendSystem, yang menyimulasikan backend LoB dan mulai mengirim pesan, lalu Anda akan melihat pemberitahuan toast muncul seperti pada gambar berikut:

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

  4. Pesan awalnya dikirim ke topik Microsoft Azure Service Bus, yang dipantau oleh langganan Microsoft Azure Service Bus pada Web Job Anda. Setelah pesan diterima, notifikasi dibuat dan dikirim ke aplikasi seluler. Anda dapat melihat log WebJob untuk mengonfirmasi proses ketika Anda masuk ke tautan Log pada portal Microsoft Azure untuk Web Job Anda:

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