Pola Antrean Prioritas

Azure Service Bus

Prioritaskan permintaan yang dikirim ke layanan sehingga permintaan dengan prioritas yang lebih tinggi diterima dan diproses lebih cepat daripada permintaan dengan prioritas lebih rendah. Pola ini berguna dalam aplikasi yang menawarkan jaminan tingkat layanan yang berbeda untuk masing-masing klien.

Konteks dan masalah

Aplikasi dapat mendelegasikan tugas tertentu ke layanan lain, misalnya, untuk melakukan pemrosesan latar belakang atau untuk berintegrasi dengan aplikasi atau layanan lain. Di cloud, antrean pesan biasanya digunakan untuk mendelegasikan tugas ke pemrosesan latar belakang. Dalam banyak kasus, urutan permintaan diterima oleh layanan tidak penting. Namun, dalam beberapa kasus, perlu memprioritaskan permintaan khusus. Permintaan ini harus diproses lebih awal dari permintaan prioritas yang lebih rendah yang sebelumnya dikirim oleh aplikasi.

Solusi

Antrean biasanya merupakan struktur first-in, first-out (FIFO), dan konsumen biasanya menerima pesan dalam urutan yang sama dengan yang diposting ke antrean. Namun, beberapa antrean pesan mendukung pesan prioritas. Aplikasi yang memposting pesan dapat menetapkan prioritas. Pesan dalam antrean secara otomatis diurutkan ulang sehingga pesan yang memiliki prioritas lebih tinggi diterima sebelum pesan yang memiliki prioritas lebih rendah. Diagram ini mengilustrasikan proses:

Diagram yang mengilustrasikan mekanisme antrean yang mendukung prioritas pesan.

Catatan

Sebagian besar implementasi antrean pesan mendukung beberapa konsumen. (Lihat Pola Konsumen yang Bersaing.) Jumlah proses konsumen dapat ditingkatkan dan diturunkan berdasarkan permintaan.

Dalam sistem yang tidak mendukung antrean pesan berbasis prioritas, solusi alternatif adalah mempertahankan antrean terpisah untuk setiap prioritas. Aplikasi bertanggung jawab untuk memposting pesan ke antrean yang sesuai. Setiap antrean dapat memiliki kumpulan konsumen yang terpisah. Antrean prioritas yang lebih tinggi dapat memiliki kumpulan konsumen yang lebih besar yang berjalan pada perangkat keras yang lebih cepat daripada antrean prioritas yang lebih rendah. Diagram ini mengilustrasikan penggunaan antrean pesan terpisah untuk setiap prioritas:

Diagram yang mengilustrasikan penggunaan antrean pesan terpisah untuk setiap prioritas.

Variasi pada strategi ini adalah menerapkan satu kumpulan konsumen yang memeriksa pesan pada antrean prioritas tinggi terlebih dahulu, dan hanya setelah itu mulai mengambil pesan dari antrean prioritas yang lebih rendah. Ada beberapa perbedaan semantik antara solusi yang menggunakan satu kumpulan proses konsumen (baik dengan satu antrean yang mendukung pesan yang memiliki prioritas berbeda atau dengan beberapa antrean yang masing-masing menangani pesan dari satu prioritas), dan solusi yang menggunakan beberapa antrean dengan kumpulan terpisah untuk setiap antrean.

Dalam pendekatan kumpulan tunggal, pesan prioritas yang lebih tinggi selalu diterima dan diproses sebelum pesan prioritas yang lebih rendah. Secara teori, pesan berprioritas rendah dapat terus digantikan dan mungkin tidak pernah diproses. Dalam pendekatan beberapa kumpulan, pesan prioritas yang lebih rendah selalu diproses, tetapi tidak secepat pesan prioritas yang lebih tinggi (tergantung pada ukuran relatif kumpulan dan sumber daya yang tersedia untuk mereka).

Menggunakan mekanisme antrean prioritas dapat memberikan keuntungan berikut:

  • Ini memungkinkan aplikasi untuk memenuhi persyaratan bisnis yang memerlukan prioritas ketersediaan atau performa, seperti menawarkan tingkat layanan yang berbeda ke grup pelanggan yang berbeda.

  • Ini dapat membantu meminimalkan biaya operasional. Jika Anda menggunakan pendekatan antrean tunggal, Anda dapat menskalakan kembali jumlah konsumen jika perlu. Pesan prioritas tinggi masih diproses terlebih dahulu (meskipun mungkin lebih lambat), dan pesan prioritas yang lebih rendah mungkin tertunda lebih lama. Jika Anda menerapkan pendekatan beberapa antrean pesan dengan kumpulan konsumen terpisah untuk setiap antrean, Anda dapat mengurangi kumpulan konsumen untuk antrean prioritas yang lebih rendah. Anda bahkan dapat menangguhkan pemrosesan untuk beberapa antrean prioritas yang sangat rendah dengan menghentikan semua konsumen yang mendengarkan pesan pada antrean tersebut.

  • Pendekatan antrean beberapa pesan dapat membantu memaksimalkan performa dan skalabilitas aplikasi dengan mempartisi pesan berdasarkan persyaratan pemrosesan. Misalnya, Anda dapat memprioritaskan tugas penting sehingga ditangani oleh penerima yang segera berjalan, dan tugas latar belakang yang kurang penting dapat ditangani oleh penerima yang dijadwalkan untuk dijalankan pada waktu yang kurang sibuk.

Pertimbangan

Pertimbangkan poin-poin berikut saat Anda memutuskan cara menerapkan pola ini:

  • Tentukan prioritas dalam konteks solusi. Misalnya, pesan prioritas tinggi dapat didefinisikan sebagai pesan yang harus diproses dalam waktu 10 detik. Identifikasi persyaratan untuk menangani item prioritas tinggi, dan sumber daya yang perlu dialokasikan untuk memenuhi kriteria Anda.

  • Tentukan apakah semua item berprioritas tinggi harus diproses sebelum item berprioritas lebih rendah. Jika pesan diproses oleh satu kumpulan konsumen, Anda harus menyediakan mekanisme yang dapat mendahului dan menangguhkan tugas yang menangani pesan prioritas rendah jika pesan prioritas yang lebih tinggi memasuki antrean.

  • Dalam pendekatan beberapa antrean, ketika Anda menggunakan satu kumpulan proses konsumen yang mendengarkan semua antrean daripada kumpulan konsumen khusus untuk setiap antrean, konsumen harus menerapkan algoritma yang memastikannya selalu melayani pesan dari antrean prioritas yang lebih tinggi sebelum pesan dari antrean prioritas yang lebih rendah.

  • Pantau kecepatan pemrosesan pada antrean prioritas tinggi dan rendah untuk memastikan bahwa pesan dalam antrean tersebut diproses pada tingkat yang diharapkan.

  • Jika Anda perlu menjamin bahwa pesan berprioritas rendah akan diproses, terapkan pendekatan beberapa antrean pesan dengan beberapa kumpulan konsumen. Atau, dalam antrean yang mendukung prioritas pesan, Anda dapat secara dinamis meningkatkan prioritas pesan antrean seiring bertambahnya usia. Kendati demikian, pendekatan ini bergantung pada antrean pesan yang menyediakan fitur ini.

  • Strategi penggunaan antrean terpisah berdasarkan prioritas pesan direkomendasikan untuk sistem yang memiliki beberapa prioritas yang terdefinisi dengan baik.

  • Sistem dapat menentukan prioritas pesan secara logis. Misalnya, daripada memiliki pesan berprioritas tinggi dan rendah secara eksplisit, Anda dapat menunjuk pesan sebagai "pelanggan yang membayar" atau "pelanggan yang tidak membayar." Sistem Anda kemudian dapat mengalokasikan lebih banyak sumber daya untuk memproses pesan dari pelanggan yang membayar.

  • Mungkin ada biaya keuangan dan pemrosesan yang terkait dengan memeriksa antrean untuk pesan. Misalnya, beberapa sistem olahpesan komersial membebankan biaya kecil setiap kali pesan diposting atau diambil, dan setiap kali antrean dikueri untuk pesan. Biaya ini meningkat saat Anda memeriksa beberapa antrean.

  • Anda dapat menyesuaikan ukuran kumpulan konsumen secara dinamis berdasarkan panjang antrean yang dilayari oleh kumpulan. Untuk informasi selengkapnya, lihat Panduan penskalaan otomatis.

Kapan menggunakan pola ini

Pola ini berguna dalam skenario di mana:

  • Sistem harus menangani banyak tugas yang memiliki prioritas berbeda.

  • Pengguna atau penyewa yang berbeda harus dilayani dengan prioritas yang berbeda.

Desain beban kerja

Arsitek harus mengevaluasi bagaimana pola Antrean Prioritas dapat digunakan dalam desain beban kerja mereka untuk mengatasi tujuan dan prinsip yang tercakup dalam pilar Azure Well-Architected Framework. Contohnya:

Pilar Bagaimana pola ini mendukung tujuan pilar
Keputusan desain keandalan membantu beban kerja Anda menjadi tahan terhadap kerusakan dan untuk memastikan bahwa keputusan tersebut pulih ke status berfungsi penuh setelah kegagalan terjadi. Memisahkan item berdasarkan prioritas bisnis memungkinkan Anda memfokuskan upaya keandalan pada pekerjaan yang paling penting.

- ALUR KRITIS RE:02
- Pekerjaan latar belakang RE:07
Efisiensi Performa membantu beban kerja Anda memenuhi tuntutan secara efisien melalui pengoptimalan dalam penskalaan, data, kode. Memisahkan item berdasarkan prioritas bisnis memungkinkan Anda memfokuskan upaya performa pada pekerjaan yang paling sensitif terhadap waktu.

- ALUR KRITIS PE:09

Seperti halnya keputusan desain apa pun, pertimbangkan tradeoff terhadap tujuan pilar lain yang mungkin diperkenalkan dengan pola ini.

Contoh

Azure tidak menyediakan mekanisme antrean yang secara asli mendukung prioritas otomatis pesan melalui pengurutan. Namun, ini menyediakan topik Azure Bus Layanan, langganan Bus Layanan yang mendukung mekanisme antrean yang menyediakan pemfilteran pesan, dan berbagai kemampuan fleksibel yang membuat Azure ideal untuk sebagian besar implementasi antrean prioritas.

Solusi Azure dapat menerapkan topik Bus Layanan tempat aplikasi dapat memposting pesan, seperti halnya mempostingnya ke antrean. Pesan dapat berisi metadata dalam bentuk properti kustom yang ditentukan aplikasi. Anda dapat mengaitkan langganan Bus Layanan dengan topik tersebut, dan langganan dapat memfilter pesan berdasarkan propertinya. Saat aplikasi mengirim pesan ke topik, pesan diarahkan ke langganan yang sesuai, di mana konsumen dapat membacanya. Proses konsumen dapat mengambil pesan dari langganan dengan menggunakan semantik yang sama dengan yang akan mereka gunakan dengan antrean pesan. (Langganan adalah antrean logis.) Diagram ini menunjukkan cara menerapkan antrean prioritas dengan menggunakan topik dan langganan Bus Layanan:

Diagram yang memperlihatkan cara menerapkan antrean prioritas dengan menggunakan topik dan langganan Bus Layanan.

Dalam diagram sebelumnya, aplikasi membuat beberapa pesan dan menetapkan properti kustom yang disebut Priority di setiap pesan. Priority memiliki nilai High atau Low. Aplikasi memposting pesan-pesan ini ke suatu topik. Topik ini memiliki dua langganan terkait yang memfilter pesan berdasarkan Priority properti . Satu langganan menerima pesan dengan properti yang Priority diatur ke High. Yang lain menerima pesan dengan properti yang Priority diatur ke Low. Kumpulan konsumen membaca pesan dari setiap langganan. Langganan prioritas tinggi memiliki kumpulan yang lebih besar, dan konsumen ini mungkin berjalan di komputer yang lebih kuat yang memiliki lebih banyak sumber daya yang tersedia daripada komputer untuk kumpulan prioritas rendah.

Tidak ada yang istimewa tentang penetapan pesan berprioritas tinggi dan rendah dalam contoh ini. Mereka hanyalah label yang ditentukan sebagai properti di setiap pesan. Mereka digunakan untuk mengarahkan pesan ke langganan tertentu. Jika diperlukan prioritas tambahan, relatif mudah untuk membuat lebih banyak langganan dan kumpulan proses konsumen untuk menangani prioritas tersebut.

Solusi PriorityQueue di GitHub didasarkan pada pendekatan ini. Solusi ini berisi proyek Azure Function bernama PriorityQueueConsumerHigh dan PriorityQueueConsumerLow. Proyek Azure Function ini terintegrasi dengan Bus Layanan melalui pemicu dan pengikatan. Mereka terhubung ke langganan berbeda yang ditentukan dan ServiceBusTrigger bereaksi terhadap pesan masuk.

public static class PriorityQueueConsumerHighFn
{
    [FunctionName("HighPriorityQueueConsumerFunction")]
    public static void Run(
      [ServiceBusTrigger("messages", "highPriority", Connection = "ServiceBusConnection")]string highPriorityMessage,
      ILogger log)
    {
        log.LogInformation($"C# ServiceBus topic trigger function processed message: {highPriorityMessage}");
    }
}

Sebagai administrator, Anda dapat mengonfigurasi berapa banyak instans yang dapat diskalakan oleh fungsi di Azure App Service. Anda dapat melakukannya dengan mengonfigurasi opsi Terapkan Batas Peluasan Skala dari portal Azure, mengatur batas peluasan skala maksimum untuk setiap fungsi. Anda biasanya perlu memiliki lebih banyak PriorityQueueConsumerHigh instans fungsi daripada PriorityQueueConsumerLow fungsi . Konfigurasi ini memastikan bahwa pesan berprioritas tinggi dibaca dari antrean lebih cepat daripada pesan berprioritas rendah.

Proyek lain, PriorityQueueSender, berisi fungsi Azure yang dipicu waktu yang dikonfigurasi untuk berjalan setiap 30 detik. Fungsi ini terintegrasi dengan Bus Layanan melalui pengikatan output dan mengirim batch pesan berprioritas rendah dan tinggi ke IAsyncCollector objek. Saat fungsi memposting pesan ke topik yang terkait dengan langganan yang digunakan oleh PriorityQueueConsumerHigh fungsi dan PriorityQueueConsumerLow , fungsi menentukan prioritas dengan menggunakan Priority properti kustom, seperti yang ditunjukkan di sini:

public static class PriorityQueueSenderFn
{
    [FunctionName("PriorityQueueSenderFunction")]
    public static async Task Run(
        [TimerTrigger("0,30 * * * * *")] TimerInfo myTimer,
        [ServiceBus("messages", Connection = "ServiceBusConnection")] IAsyncCollector<ServiceBusMessage> collector)
    {
        for (int i = 0; i < 10; i++)
        {
            var messageId = Guid.NewGuid().ToString();
            var lpMessage = new ServiceBusMessage() { MessageId = messageId };
            lpMessage.ApplicationProperties["Priority"] = Priority.Low;
            lpMessage.Body = BinaryData.FromString($"Low priority message with Id: {messageId}");
            await collector.AddAsync(lpMessage);

            messageId = Guid.NewGuid().ToString();
            var hpMessage = new ServiceBusMessage() { MessageId = messageId };
            hpMessage.ApplicationProperties["Priority"] = Priority.High;
            hpMessage.Body = BinaryData.FromString($"High priority message with Id: {messageId}");
            await collector.AddAsync(hpMessage);
        }
    }
}

Langkah berikutnya

Sumber daya berikut mungkin berguna bagi Anda saat Anda menerapkan pola ini:

  • Sampel yang menunjukkan pola ini, di GitHub.

  • Primer olahpesan asinkron. Layanan konsumen yang memproses permintaan mungkin perlu mengirim balasan ke instans aplikasi yang memposting permintaan. Artikel ini menyediakan informasi tentang strategi yang dapat Anda gunakan untuk menerapkan pesan permintaan/respons.

  • Panduan penskalaan otomatis. Anda terkadang dapat menskalakan ukuran kumpulan proses konsumen yang menangani antrean berdasarkan panjang antrean. Strategi ini dapat membantu Anda meningkatkan performa, terutama untuk kumpulan yang menangani pesan prioritas tinggi.

Pola berikut mungkin berguna bagi Anda ketika Anda menerapkan pola ini:

  • Pola Konsumen yang Bersaing. Untuk meningkatkan throughput antrean, Anda dapat menerapkan beberapa konsumen yang mendengarkan tugas antrean dan proses yang sama secara paralel. Konsumen ini bersaing untuk pesan, tetapi hanya satu yang dapat memproses setiap pesan. Artikel ini memberikan informasi lebih lanjut tentang manfaat dan kerugian penerapan pendekatan ini.

  • Pola pembatasan. Anda dapat mengimplementasikan pembatasan menggunakan antrean. Anda dapat menggunakan olahpesan prioritas untuk memastikan bahwa permintaan dari aplikasi penting, atau aplikasi yang dijalankan oleh pelanggan bernilai tinggi, diberikan prioritas atas permintaan dari aplikasi yang kurang penting.