Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kelompokkan pesan terkait menurut kunci kategori dan proses setiap grup secara berurutan, satu pesan sekaligus, sambil memproses grup yang berbeda secara paralel.
Pola ini menyelesaikan ketegangan antara mempertahankan kebenaran first-in, first-out (FIFO) dalam setiap grup logis dan menskalakan pemrosesan bersamaan di seluruh grup. Desain memastikan bahwa batasan pemesanan tidak menjadi hambatan di seluruh sistem.
Konteks dan masalah
Aplikasi sering kali perlu memproses pesan terkait dalam urutan kedatangannya saat masih meluaskan skala untuk menangani peningkatan beban. Dalam arsitektur terdistribusi, persyaratan ini sulit dicapai karena pekerja secara independen menarik pesan dari antrean bersama. Ketika beberapa pekerja bersaing untuk pesan, seperti dalam pola Konsumen yang Bersaing, pemesanan rusak.
Pertimbangkan sistem pelacakan pesanan yang menerima aliran operasi, seperti membuat pesanan, menambahkan transaksi, memodifikasi transaksi sebelumnya, dan menghapus pesanan. Setiap operasi pesanan harus diproses dalam urutan FIFO, karena menerapkannya di luar urutan akan merusak status pesanan. Namun, antrean yang masuk menginterelasi operasi di banyak pesanan. Satu konsumen yang memberlakukan pemesanan global menjadi hambatan, dan beberapa konsumen mungkin memproses operasi pesanan yang sama di luar urutan.
Pendekatan-pendekatan yang tampak sederhana untuk masalah ini masing-masing gagal dengan cara yang berbeda-beda:
Konsumen tunggal. Satu konsumen mempertahankan urutan pesan karena memproses satu pesan pada satu waktu, tetapi tidak dapat diskalakan untuk menangani peningkatan throughput.
Beberapa konsumen yang bersaing. Beberapa konsumen menskalakan throughput dengan menarik pesan secara paralel, tetapi mereka kehilangan jaminan pemesanan per grup. Dua pekerja dapat menarik pesan berturut-turut untuk urutan yang sama dan memprosesnya secara bersamaan atau tidak berurutan, yang merusak status pesanan.
Solution
Pola Konvoi Berurutan mempartisi pesan terkait ke dalam kategori dan memproses setiap kategori secara berurutan, satu pesan sekaligus, sementara kategori diproses secara paralel.
Pola bekerja dengan menetapkan setiap pesan kunci kategori yang mengidentifikasi grup miliknya. Broker pesan menggunakan kunci ini untuk mempartisi pesan ke dalam grup logis. Dalam setiap grup, broker menerapkan urutan FIFO sehingga konsumen yang mengunci grup tersebut menerima pesan secara berurutan sesuai dengan urutan saat pesan dimasukkan ke antrean. Grup yang berbeda dapat diproses oleh konsumen yang berbeda secara bersamaan, sehingga sistem menskalakan secara horizontal di seluruh grup tanpa mengorbankan pemesanan dalam satu grup pun.
Pada Azure, sesi pesan Azure Service Bus menyediakan implementasi bawaan dari pola ini.
Diagram berikut menunjukkan pola Konvoi Berurutan umum.
Di dalam antrean, pesan untuk berbagai kategori mungkin tersusun berselang-seling, seperti yang ditunjukkan dalam diagram berikut.
Pola ini memberikan beberapa manfaat utama:
Pemrosesan berurutan per grup. Pesan dalam setiap kategori diproses secara ketat secara berurutan, yang mencegah kondisi perlombaan, mutasi status di luar urutan, dan kebutuhan untuk menyusun ulang solusi.
Skala horizontal di seluruh grup. Setiap kategori adalah unit konkurensi independen. Menambahkan konsumen meningkatkan throughput secara proporsional ke jumlah kategori aktif, tanpa melanggar jaminan pemesanan.
Pemisahan produsen-konsumen. Produsen mengantrekan pesan tanpa sepengetahuan konsumen mana yang akan memprosesnya atau kapan. Konsumer dapat diskalakan dan digantikan secara mandiri.
Masalah dan pertimbangan
Pertimbangkan poin-poin berikut saat Anda memutuskan cara menerapkan pola ini:
Kategori dan unit skala. Tentukan properti pesan masuk yang dapat Anda skalakan. Kunci kategori mendefinisikan unit paralelisme: setiap nilai kunci yang berbeda menjadi grup yang dapat diproses secara independen. Dalam skenario pelacakan pesanan, properti ini adalah ID pesanan. Memilih kunci yang terlalu kasar (misalnya, SATU ID pelanggan untuk semua pesanan) membatasi paralelisme, sambil memilih kunci yang terlalu baik tidak memberikan manfaat pemesanan yang bermakna.
Batas laju pemrosesan. Evaluasikan throughput pesan target Anda. Karena pola ini memberlakukan pemrosesan berurutan dalam setiap kategori, throughput per kategori dibatasi oleh waktu untuk memproses satu pesan. Optimalkan waktu pemrosesan per pesan, misalnya dengan menggunakan I/O asinkron atau melakukan penulisan ke sistem downstream secara batch, karena waktu tersebut secara langsung menentukan throughput maksimum untuk setiap kategori. Jika kebutuhan throughput Anda secara keseluruhan sangat tinggi, pertimbangkan kembali apakah urutan FIFO yang ketat benar-benar diperlukan untuk seluruh siklus hidup pesan. Alternatifnya termasuk memberlakukan pesan awal dan pesan akhir untuk mengurungkan urutan, atau mengurutkan pesan berdasarkan tanda waktu dalam jendela batch lalu mengirim batch untuk pemrosesan paralel.
Kemampuan layanan. Verifikasi apakah broker pesan pilihan Anda mendukung pemrosesan pesan satu per satu dalam antrean atau kategori antrean. Tidak semua layanan pesan menyediakan penguncian tingkat sesi atau jaminan FIFO di dalam partisi. Jika broker tidak secara asli mendukung kemampuan ini, konsumen harus menerapkan logika koordinasinya sendiri, yang menambahkan kompleksitas dan risiko pemrosesan duplikat, pesan yang terlewat, atau eksekusi di luar urutan. Dukungan untuk sesi mungkin juga membatasi pilihan tingkat layanan olah pesan atau SKU, yang memengaruhi biaya.
Evolvabilitas. Rencanakan bagaimana Anda akan menambahkan kategori pesan baru ke sistem. Pola tersebut harus mengakomodasi pertumbuhan kardinalitas kategori tanpa memerlukan perubahan struktural pada konsumen. Misalnya, misalkan sistem ledger yang dijelaskan sebelumnya khusus untuk satu pelanggan. Jika Anda perlu onboarding pelanggan baru, Anda harus dapat menambahkan sekumpulan prosesor ledger yang mendistribusikan pekerjaan per ID pelanggan tanpa mendesain ulang topologi antrean.
Pengiriman pesan yang tidak berurutan. Pesan dapat tiba tidak berurutan karena latensi jaringan yang bervariasi antara produser dan broker, sebelum pengurutan sesi oleh broker mulai berlaku. Pertimbangkan untuk menggunakan nomor urut untuk memverifikasi pemesanan dalam setiap kategori. Anda juga dapat menyertakan bendera akhir urutan dalam pesan terakhir transaksi sehingga konsumen dapat mendeteksi kapan urutan selesai.
Penanganan pesan racun. Pesan yang berulang kali gagal diproses dalam sesi memblokir semua pesan berikutnya dalam sesi tersebut karena pola memberlakukan pengurutan berurutan yang ketat. Rancang strategi untuk mendeteksi pesan bermasalah, seperti melacak jumlah upaya pengiriman, dan memindahkannya ke dead-letter queue setelah mencapai ambang batas percobaan ulang yang ditentukan agar pesan yang tersisa dalam sesi dapat terus diproses.
Ketersediaan broker. Broker pesan adalah dependensi bersama untuk semua kategori. Ketersediaan dan durabilitasnya secara langsung memengaruhi jaminan keandalan pola. Evaluasi fitur ketahanan tingkat broker seperti zona ketersediaan dan pemulihan bencana geografis berdasarkan persyaratan ketersediaan dan anggaran beban kerja, karena konfigurasi durabilitas yang lebih tinggi biasanya meningkatkan biaya.
Keakuratan kunci producer. Pola mengasumsikan bahwa produsen menetapkan kunci kategori (ID sesi) dengan benar pada setiap pesan. Jika produser menetapkan kunci yang salah, baik secara tidak sengaja maupun karena bug, pesan akan dirutekan ke sesi yang salah dan merusak status grup itu. Pastikan bahwa produsen menetapkan kunci kategori secara konsisten, dan pertimbangkan untuk menambahkan logika validasi kunci pada sisi konsumen jika konsekuensi dari pesan yang salah diarahkan serius.
Kompleksitas operasional. Pemantauan pemrosesan berbasis sesi menambah beban operasional dibandingkan dengan pemrosesan antrean standar. Operator memerlukan visibilitas ke backlog sesi (jumlah sesi aktif dan kedalaman pesan yang menunggu di setiap sesi) untuk mengidentifikasi kategori yang tertinggal. Sesi surat mati memerlukan alur kerja pemantauan dan remediasi terpisah untuk menyelidiki pesan yang gagal, menyelesaikan akar penyebabnya, dan memutar ulang pesan yang dikoreksi kembali ke dalam sesi.
Pertikaian dan latensi kunci sesi. Penguncian sesi menimbulkan tambahan latensi karena setiap konsumen harus memperoleh kunci eksklusif untuk suatu sesi sebelum memproses pesan. Ketika konsumen memegang kunci sesi, tidak ada konsumen lain yang dapat memproses pesan dari sesi tersebut, bahkan jika konsumen lambat atau terhenti sementara. Jika durasi kunci terlalu pendek, kedaluwarsa kunci dapat menyebabkan pemrosesan ulang pesan. Jika durasi kunci terlalu panjang, konsumen yang terhenti menunda pemulihan. Sesuaikan durasi penguncian sesi berdasarkan waktu pemrosesan pesan yang diharapkan, dan terapkan perpanjangan kunci untuk operasi yang berjalan lebih lama.
Skalabilitas konsumen dan biaya. Paralelisme antar sesi berarti instans konsumen yang berjalan secara bersamaan. Dalam model tanpa server seperti Azure Functions, setiap sesi aktif setara dengan satu eksekusi konkuren, sedangkan dalam model terdedikasi, setiap sesi aktif setara dengan satu instans atau utas. Oleh karena itu, jumlah sesi aktif secara langsung memengaruhi biaya komputasi. Rencanakan batas penskalaan konsumen dan kontrol konkurensi untuk menyeimbangkan throughput terhadap biaya.
Kapan menggunakan pola ini
Gunakan pola ini ketika:
- Pesan tiba secara berurutan dan harus diproses dalam urutan yang sama.
- Pesan dapat dikategorikan sehingga setiap kategori menjadi unit skala independen untuk sistem.
Pola ini mungkin tidak cocok ketika:
Anda mengharapkan skenario throughput yang sangat tinggi (jutaan pesan per menit), karena persyaratan FIFO membatasi penskalaan yang dapat dicapai sistem.
Pengurutan pesan tidak diperlukan. Ketika pesan dapat diproses secara independen dalam urutan apa pun, pola Competing Consumers pattern memungkinkan penskalaan horizontal yang lebih sederhana tanpa overhead koordinasi akibat penguncian sesi.
Desain beban kerja
Evaluasi cara menggunakan Konvoi Berurutan dalam desain beban kerja untuk mengatasi tujuan dan prinsip yang tercakup dalam pilar kerangka kerja Azure Well-Architected. Tabel berikut memberikan panduan tentang bagaimana pola ini mendukung tujuan setiap pilar.
| Prinsip Dasar | Bagaimana pola ini mendukung tujuan pilar |
|---|---|
| Keputusan desain Keandalan membantu beban kerja Anda menjadi tangguh tidak berfungsi dan memastikan bahwa memulihkan ke keadaan yang berfungsi penuh setelah kegagalan terjadi. | Pola ini menggunakan pengurutan FIFO berbasis sesi untuk menghilangkan kondisi balapan, logika penanganan pesan yang rentan terhadap perebutan sumber daya, dan solusi sementara lainnya untuk menangani pesan yang urutannya salah, yang dapat menyebabkan malfungsi. - RE:02 Alur Kritis - RE:07 Pekerjaan latar belakang |
Jika pola ini memperkenalkan kompromi di dalam pilar, bandingkan dengan tujuan pilar lain.
Contoh
Pada Azure, Anda dapat menerapkan pola ini dengan menggunakan sesi pesan Bus Layanan. Bagi konsumen, Anda dapat menggunakan Azure Logic Apps dengan konektor peek-lock Bus Layanan atau Azure Functions dengan pemicu Bus Layanan.
Saat produsen mengatur SessionId properti pada pesan, Bus Layanan mengelompokkan semua pesan yang berbagi ID sesi yang sama ke dalam satu sesi logis. Konsumen menerima sebuah sesi dan memperoleh kunci eksklusif pada sesi tersebut. Kunci ini menjamin bahwa hanya satu konsumen yang memproses pesan untuk sesi tersebut kapan saja dan pesan tersebut tiba dalam urutan FIFO. Konsumer lain dapat secara bersamaan menerima dan memproses sesi yang berbeda, sehingga memungkinkan throughput paralel antargrup.
Dalam contoh pelacakan pesanan, sistem memproses setiap pesan ledger dalam urutan yang diterimanya dan mengirim setiap transaksi ke antrean lain di mana kategori diatur ke ID pesanan. Dalam skenario ini, transaksi tidak pernah melibatkan beberapa pesanan, sehingga konsumen memproses tiap kategori secara paralel, tetapi tetap mengikuti urutan FIFO dalam tiap kategori.
Prosesor ledger mendistribusikan pesan dengan memecah batch konten setiap pesan dalam antrean pertama:
Prosesor ledger melakukan tiga langkah:
- Menelusuri buku besar satu transaksi demi satu transaksi.
- Mengatur ID sesi pesan agar sesuai dengan ID pesanan.
- Mengirim setiap transaksi ledger ke antrean sekunder dengan ID sesi ditetapkan ke ID pesanan.
Konsumen memantau antrean sekunder dan memproses semua pesan dengan ID pesanan yang sama dalam urutan FIFO. Konsumen menggunakan mode peek-lock.
Antrean ledger adalah titik transisi dari serial ke paralel: semua transaksi melewatinya secara berurutan sebelum kemudian didistribusikan ke pemrosesan paralel berbasis sesi. Tahap serialisasi ini merupakan hambatan utama terhadap skalabilitas karena membatasi throughput keseluruhan alur pemrosesan hilir. Namun, setelah prosesor ledger mengeluarkan pesan ke antrean sekunder, konsumen dapat menskalakan secara independen di seluruh sesi, satu per ID pesanan.
Teknologi pendukung
Sesi pesan Bus Layanan: Mengelompokkan pesan berdasarkan ID sesi dan menerapkan pemrosesan FIFO dalam setiap sesi. Sesi pesan adalah mekanisme Azure utama untuk menerapkan pola Konvoi Berurutan.
pemicu Azure Functions Bus Layanan: Mendukung pemicu berbasis sesi yang memungkinkan instans fungsi memproses pesan dari satu sesi pada satu waktu.
Konektor Bus Layanan Logic Apps: Menyediakan konektor Bus Layanan dengan dukungan peek-lock untuk mengkonsumsi antrean yang mendukung sesi dalam pemrosesan berbasis alur kerja.
Kontributor
Microsoft mempertahankan artikel ini. Kontributor berikut menulis artikel ini.
Penulis utama:
- Naga Venkata Cheruvu | Arsitek Solusi Komputasi Awan Senior + Infrastruktur AI
Untuk melihat profil LinkedIn nonpublik, masuk ke LinkedIn.
Sumber daya terkait
Pola Konsumen Kompetitif: Beberapa konsumen menarik pesan dari antrean bersama secara paralel, yang meningkatkan throughput tetapi menghilangkan jaminan urutan tiap pesan. Pola Sequential Convoy mengatasi kesenjangan pengurutan yang diperkenalkan oleh Competing Consumers. Ini mengatasi kesenjangan ini dengan mempartisi pesan ke dalam sesi yang di-kategori dan memproses setiap sesi secara berurutan.
Pola Queue-Based Load Leveling: Antrean berfungsi sebagai penyangga antara produsen dan konsumen untuk menyerap lonjakan dan meratakan beban yang tidak merata. Pola Konvoi Berurutan dibangun berdasarkan mekanisme buffering ini dengan menambahkan pemartisian berbasis sesi, sehingga antrean tersebut menyeimbangkan beban di seluruh kategori dan mempertahankan urutan FIFO dalam setiap kategori.
Pola Antrean Prioritas: Pesan dirutekan ke antrean terpisah atau prioritas tertentu dalam antrean sehingga pekerjaan berprioritas lebih tinggi diproses sebelum pekerjaan berprioritas lebih rendah. Ketika urutan pemrosesan di dalam setiap tingkat prioritas juga harus dipertahankan, pola Sequential Convoy dapat dikombinasikan dengan antrean prioritas untuk memastikan pemrosesan FIFO dalam setiap sesi yang diidentifikasi oleh kunci prioritas.
Peek-Lock Message (Pembacaan Tanpa Menghapus): Operasi ini secara atomik mengambil dan mengunci pesan dari antrean atau langganan untuk diproses.
Untuk pengiriman pesan berkorelasi di Logic Apps dengan menggunakan sesi Bus Layanan: Posting blog ini menjelaskan dukungan Logic Apps untuk pola Konvoi Berurutan.