Artikel ini terutama mempelajari Ratelimit - konten yang relevan dari menggunakan Guava untuk melakukan pembatasan aliran antarmuka, sebagai berikut.
1. Deskripsi Masalah
Suatu hari, Mr. A tiba -tiba menemukan bahwa jumlah permintaan antarmukanya tiba -tiba meningkat menjadi 10 kali lipat sebelumnya. Tidak lama kemudian, antarmuka hampir tidak dapat digunakan dan memicu reaksi berantai yang menyebabkan seluruh sistem runtuh. Bagaimana cara menangani situasi ini? Hidup memberi kita jawabannya: Misalnya, sakelar kuno dilengkapi dengan sekering. Setelah seseorang menggunakan peralatan daya super tinggi, sekering akan ditiup untuk melindungi setiap alat dari dibakar oleh arus yang kuat. Demikian pula, antarmuka kami juga perlu dipasang dengan "sekering" untuk mencegah kelumpuhan sistem yang disebabkan oleh tekanan berlebihan pada sistem dengan permintaan yang tidak terduga. Ketika lalu lintas terlalu besar, mekanisme seperti penolakan atau drainase dapat diadopsi.
2. Algoritma pembatas arus yang umum digunakan
Ada dua algoritma pembatas arus yang umum digunakan: algoritma bucket bocor dan algoritma token bucket.
Gagasan algoritma bucket bocor sangat sederhana. Harap masukkan ember bocor terlebih dahulu. Bucket bocor akan keluar dengan kecepatan tertentu. Ketika permintaan air terlalu besar, itu akan meluap secara langsung. Dapat dilihat bahwa algoritma bucket bocor dapat secara paksa membatasi laju transmisi data.
Gambar 1 Diagram skematik algoritma bucket bocor
Untuk banyak skenario aplikasi, selain dapat membatasi tingkat transmisi rata -rata data, juga diperlukan untuk memungkinkan beberapa tingkat transmisi burst. Pada saat ini, algoritma bucket bocor mungkin tidak cocok, dan algoritma token bucket lebih cocok. Seperti yang ditunjukkan pada Gambar 2, prinsip algoritma Token Bucket adalah bahwa sistem akan memasukkan token ke dalam ember pada kecepatan konstan. Jika permintaan perlu diproses, perlu untuk mendapatkan token dari ember terlebih dahulu. Ketika tidak ada token di ember, layanan akan ditolak.
Gambar 2 Diagram Skema Algoritma Token Bucket
3. Ratelimiter di kelas alat pembatas saat ini
Toolkit Open Source Google Guava menyediakan kelas Ratelimiter, yang didasarkan pada "algoritma token bucket" dan sangat nyaman untuk digunakan. Untuk penggunaan spesifik antarmuka kelas ini, silakan merujuk ke praktik penggunaan Ratelimiter.
Ratelimiter menggunakan demo
Paket ratelimite; impor com.google.common.util.concurrent.ratelimiter; kelas publik ratelimiterDemo {public static void main (string [] args) {testnoratelimiter (); testwithrateLimiter ();} public static void testnoratelimiter () {) {longent. i <10; i ++) {System.out.println ("Call Execute .."+i);} Long End = System.CurrentTimeMillis (); System.out.println (akhir - mulai);} public void uji dengan no -ratel () {long start = System.currentTimillis (); no -ratel () {long start = System.currentTimillis (); ratelis (); dari 10 tugas per detik diserahkan untuk (int i = 0; i <10; i ++) {limiter.acquire (); // minta ratelimiter, melebihi izin akan diblokir system.out.println ("Call Execute .."+i);} Long End = System.currentTimeMillis (); System.out.out.pint); start -prinn (start) end (start) end (System.currentTimeMillis (); System.out.out.out.out.oint.out.out.oTK) (start) (start) end -printer (System. Empat Concurrency Guava: ListenableFuture dan Contoh Ratelimiter
konsep
ListenableFuture, seperti namanya, adalah masa depan yang dapat didengarkan, ini merupakan peningkatan yang diperluas untuk masa depan asli Java. Kita tahu bahwa masa depan mewakili tugas perhitungan asinkron, dan hasil perhitungan dapat diperoleh ketika tugas selesai. Jika kami ingin mendapatkan hasil dan menampilkannya kepada pengguna setelah perhitungan selesai atau melakukan perhitungan lainnya, kami harus menggunakan utas lain untuk terus -menerus meminta status perhitungan. Ini membuat kode kompleks dan tidak efisien. Gunakan ListenableFuture Guava untuk membantu kami mendeteksi apakah masa depan selesai. Jika selesai, fungsi callback akan dipanggil secara otomatis, yang dapat mengurangi kompleksitas program bersamaan.
Metode kedua disarankan, karena metode kedua dapat secara langsung mendapatkan nilai pengembalian di masa depan atau menangani kesalahan. Intinya, metode kedua dicapai dengan memobilisasi metode pertama dan enkapsulasi lebih lanjut dilakukan.
Selain itu, ListenableFuture memiliki beberapa implementasi bawaan lainnya:
SettableFuture: Tidak perlu menerapkan metode untuk menghitung nilai pengembalian, tetapi hanya nilai tetap yang diperlukan untuk mengembalikan sebagai nilai pengembalian. Anda dapat menetapkan nilai pengembalian atau informasi pengecualian di masa depan ini melalui program.
CheckedFuture: Ini adalah yang diwarisi dari antarmuka ListenableFuture. Ini menyediakan metode checkedget (). Metode ini dapat melempar pengecualian dari jenis yang ditentukan ketika pengecualian terjadi dalam eksekusi di masa mendatang.
Ratelimiter mirip dengan JDK's Semaphore. Ini digunakan untuk membatasi jumlah utas untuk mengakses secara bersamaan dengan sumber daya. Artikel ini memperkenalkan penggunaan ratelimiter.
Contoh Kode
impor java.util.concurrent.callable; impor java.util.concurrent.executionException; impor java.util.concurrent.executors; import java.util.concurrent.timeunit; import com.google.common.util.concurrent.futurrent; com.google.common.util.concurrent.futures; import com.google.common.util.concurrent.listenableFuture; import com.google.common.util.concurrent.listeningexecutorservice; impor com.google.common.util.concurrent.concurrent.concurrentors; com.google.common.util.concurrent.ratelimiter; kelas publik listenablefuturedemo {public static void main (string [] args) {testratelimiter (); testlistenableFuture (); testratelimiter () {listeningExecutorService ExecutorService = moreExecutors .listeningDecorator (executors.newcachedThreadpool ()); ratelimiter limiter = ratelimiter.create (5.0); // tidak lebih dari 4 tugas diajukan per detik untuk (int i = 0; i <10; i <10; i <10); Izin yang melebihi akan diblokir Final ListenableFuture <Integer> listenableFuture = ExecutorService .submit (Tugas baru ("adalah"+ i));}} public static void testListenableFuture () {ListeningExecutorServiceService = MoreExecutors .DisteningDecorator (ExecutorsReADREODREOD (MOREEEXEXECOR. Final ListenableFuture <Integer> listenableFuture = ExecutorService .submit (Tugas baru ("TestListenableFuture")); // Secara sinkron dapatkan hasil panggilan coba {System.out.println (ListenableFuture.get ());} Catch (interruptEcception E1) {exceprinteon (); {E1.PrintStackTrace ();} // Jalan pertama listenableFuture.addlistener (runnable baru () {@Override public void run () {try {System.out.println ("dapatkan oDruptException foundsception {) () (}}} {o); ExecutorService); // Cara kedua futures.addcallback (listenableFuture, futureCallback baru <Integer> () {@Override public void OnSuccess (hasil integer) {System.out .println ("Dapatkan Hasil Masa Depan yang Dapat Dengarkan dengan Callback" + Hasil);}@override OnF OnF OnF) {T.PrintStackTrace ();}});}} Tugas kelas mengimplementasikan Callable <Integer> {string str; tugas publik (string str) {this.str = str;}@override public integer call () lempar pengecualian {System.out.println ("call execute .." + str); time.sets.Versi jambu jambu
<dependency> <GroupId> com.google.guava </groupid> <ArTifactId> guava </artifactid> <version> 14.0.1 </version> </dependency>
Meringkaskan
Di atas adalah semua tentang ratelimit - menggunakan jambu guava untuk membuat contoh kode pembatas arus antarmuka. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!