Pola Pemerataan Beban Berdasarkan Antrean

Azure Functions
Azure Service Bus

Gunakan antrean yang bertindak sebagai penyangga antara tugas dan layanan yang dipanggil untuk memperlancar beban berat yang terputus-putus yang dapat menyebabkan layanan gagal atau tugas kehabisan waktu. Ini dapat membantu meminimalkan dampak puncak permintaan pada ketersediaan dan responsivitas untuk tugas dan layanan.

Konteks dan masalah

Banyak solusi di cloud melibatkan menjalankan tugas yang meminta layanan. Dalam lingkungan ini, jika layanan mengalami beban berat yang terputus-putus, hal ini dapat menyebabkan masalah performa atau keandalan.

Layanan dapat menjadi bagian dari solusi yang sama dengan tugas yang menggunakannya, atau dapat berupa layanan pihak ketiga yang menyediakan akses ke sumber daya yang sering digunakan seperti cache atau layanan penyimpanan. Jika layanan yang sama digunakan oleh sejumlah tugas yang berjalan secara bersamaan, mungkin sulit untuk memprediksi volume permintaan ke layanan setiap saat.

Sebuah layanan mungkin mengalami puncak permintaan yang menyebabkannya kelebihan beban dan tidak dapat menanggapi permintaan secara tepat waktu. Membanjiri layanan dengan sejumlah besar permintaan bersamaan juga dapat mengakibatkan layanan gagal jika tidak dapat menangani pertengkaran yang disebabkan oleh permintaan ini.

Solusi

Melakukan refaktor solusi dan memperkenalkan antrean antara tugas dan layanan. Tugas dan layanan berjalan secara asinkron. Tugas memposting pesan yang berisi data yang diperlukan oleh layanan ke antrean. Antrean bertindak sebagai buffer, menyimpan pesan sampai diambil oleh layanan. Layanan mengambil pesan dari antrean dan memprosesnya. Permintaan dari sejumlah tugas, yang dapat dihasilkan pada tingkat yang sangat bervariasi, dapat diteruskan ke layanan melalui antrean pesan yang sama. Gambar ini menunjukkan penggunaan antrean untuk meratakan beban pada layanan.

Gambar 1 - Menggunakan antrean untuk meratakan beban pada layanan

Antrean memisahkan tugas dari layanan, dan layanan dapat menangani pesan dengan kecepatannya sendiri terlepas dari volume permintaan dari tugas bersamaan. Selain itu, tidak ada penundaan untuk tugas jika layanan tidak tersedia saat mengirim pesan ke antrean.

Pola ini memberikan manfaat sebagai berikut:

  • Ini dapat membantu memaksimalkan ketersediaan karena penundaan yang timbul dalam layanan tidak akan berdampak langsung dan langsung pada aplikasi, yang dapat terus mengirim pesan ke antrean bahkan ketika layanan tidak tersedia atau sedang tidak memproses pesan.

  • Ini dapat membantu memaksimalkan skalabilitas karena jumlah antrean dan jumlah layanan dapat bervariasi untuk memenuhi permintaan.

  • Hal ini dapat membantu mengendalikan biaya karena jumlah instans layanan yang diterapkan hanya harus memadai untuk memenuhi beban rata-rata daripada beban puncak.

    Beberapa layanan menerapkan pembatasan saat permintaan mencapai ambang batas di mana sistem bisa gagal. Pembatasan dapat mengurangi fungsionalitas yang tersedia. Anda dapat menerapkan perataan beban dengan layanan ini untuk memastikan bahwa ambang batas ini tidak tercapai.

Masalah dan pertimbangan

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

  • Penting untuk menerapkan logika aplikasi yang mengontrol kecepatan layanan menangani pesan untuk menghindari sumber daya target yang berlebihan. Hindari penerusan lonjakan permintaan ke tahap sistem berikutnya. Uji sistem di bawah beban untuk memastikan bahwa itu menyediakan leveling yang diperlukan, dan sesuaikan jumlah antrean dan jumlah instans layanan yang menangani pesan untuk mencapai hal ini.
  • Antrean pesan adalah mekanisme komunikasi satu arah. Jika tugas mengharapkan balasan dari layanan, mungkin perlu menerapkan mekanisme yang dapat digunakan layanan untuk mengirim respons. Untuk informasi selengkapnya, lihat Asynchronous Messaging Primer.
  • Berhati-hatilah jika Anda menerapkan penskalaan otomatis ke layanan yang mendengarkan permintaan pada antrean. Hal ini dapat mengakibatkan peningkatan pertentangan untuk sumber daya apa pun yang dibagikan oleh layanan ini dan mengurangi efektivitas penggunaan antrean untuk meratakan beban.
  • Tergantung pada beban layanan, Anda dapat mengalami situasi di mana Anda secara efektif selalu membuntuti, di mana sistem selalu mengantre lebih banyak permintaan daripada yang Anda proses. Varianbilitas lalu lintas masuk ke aplikasi Anda perlu dipertimbangkan
  • Pola dapat kehilangan informasi tergantung pada persistensi Antrean. Jika antrean Anda mengalami crash atau menghilangkan informasi (karena batas sistem) ada kemungkinan Anda tidak memiliki pengiriman yang dijamin. Perilaku antrean dan batas sistem Anda perlu dipertimbangkan berdasarkan kebutuhan solusi Anda.

Kapan menggunakan pola ini

Pola ini berguna bagi semua aplikasi yang menggunakan layanan yang rentan terhadap kelebihan beban.

Pola ini tidak berguna jika aplikasi mengharapkan respons dari layanan dengan latensi minimal.

Desain beban kerja

Arsitek harus mengevaluasi bagaimana pola Tingkatan Beban Berbasis Antrean 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. Pendekatan yang dijelaskan dalam pola ini dapat memberikan ketahanan terhadap lonjakan permintaan yang tiba-tiba dengan memisahkan kedatangan tugas dari pemrosesan mereka. Ini juga dapat mengisolasi kerusakan dalam pemrosesan antrean sehingga tidak memengaruhi asupan.

- PENSKALAKAN RE:06
- Pekerjaan latar belakang RE:07
Pengoptimalan Biaya difokuskan untuk mempertahankan dan meningkatkan pengembalian beban kerja Anda pada investasi. Karena pemrosesan beban dipisahkan dari permintaan atau asupan tugas, Anda dapat menggunakan pendekatan ini untuk mengurangi kebutuhan akan sumber daya provisi berlebih untuk menangani beban puncak.

- Biaya penskalan CO:12
Efisiensi Performa membantu beban kerja Anda memenuhi tuntutan secara efisien melalui pengoptimalan dalam penskalaan, data, kode. Pendekatan ini memungkinkan desain yang disengaja pada performa throughput karena asupan permintaan tidak perlu berkorelasi dengan tingkat di mana mereka diproses.

- PE:05 Penskalaan dan pemartisian

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

Contoh

Aplikasi web menulis data ke penyimpanan data eksternal. Jika sejumlah besar aplikasi web berjalan secara bersamaan, penyimpanan data mungkin tidak dapat merespons permintaan dengan cukup cepat, menyebabkan permintaan kehabisan waktu, dibatasi, atau gagal. Diagram berikut menunjukkan penyimpanan data yang kewalahan oleh sejumlah besar permintaan bersamaan dari instans aplikasi.

Gambar 2 - Layanan yang kewalahan oleh sejumlah besar permintaan serentak dari aplikasi web

Untuk mengatasi ini, Anda dapat menggunakan antrean untuk meratakan beban antara instans aplikasi dan penyimpanan data. Aplikasi Azure Functions membaca pesan dari antrean dan melakukan permintaan baca/tulis ke penyimpanan data. Logika aplikasi dalam aplikasi fungsi dapat mengontrol kecepatan pengiriman permintaan ke penyimpanan data, untuk mencegah penyimpanan kewalahan. (Jika tidak, aplikasi fungsi hanya akan memperkenalkan kembali masalah yang sama di backend.)

Gambar 3 - Menggunakan antrean dan aplikasi fungsi untuk meratakan beban

Langkah berikutnya

Panduan berikut bisa jadi relevan saat menerapkan pola berikut ini:

  • Primer Olahpesan Asinkron. Antrean pesan secara inheren tidak sinkron. Mungkin perlu mendesain ulang logika aplikasi dalam tugas jika diadaptasi dari berkomunikasi secara langsung dengan layanan hingga menggunakan antrean pesan. Demikian pula, mungkin perlu untuk refaktor layanan untuk menerima permintaan dari antrean pesan. Atau, Anda dapat mengimplementasikan layanan proksi, seperti yang dijelaskan dalam contoh.

  • Memilih di antara layanan olahpesan Azure. Informasi tentang memilih mekanisme pesan dan antrean di aplikasi Azure.

  • Komunikasi berbasis pesan asinkron.

  • Gaya arsitektur Web-Queue-Worker. Web dan pekerja sama-sama tanpa status. Status sesi dapat disimpan dalam cache terdistribusi. Setiap pekerjaan yang sudah berjalan lama dilakukan secara asinkron oleh pekerja. Pekerja dapat dipicu oleh pesan pada antrean, atau berjalan pada jadwal untuk pemrosesan batch.

Pola berikut mungkin juga relevan saat menerapkan pola ini:

  • Pola Konsumen yang Bersaing. Dimungkinkan untuk menjalankan beberapa instans layanan, masing-masing bertindak sebagai konsumen pesan dari antrean perataan beban. Anda dapat menggunakan pendekatan ini untuk menyesuaikan tingkat penerimaan dan pengiriman pesan ke layanan.

  • Pola pembatasan. Cara sederhana untuk menerapkan pembatasan dengan layanan adalah dengan menggunakan perataan beban berbasis antrean dan merutekan semua permintaan ke layanan melalui antrean pesan. Layanan dapat memproses permintaan dengan kecepatan yang memastikan bahwa sumber daya yang dibutuhkan oleh layanan tidak habis, dan untuk mengurangi jumlah kontensi yang dapat terjadi.