هذه المقالة تدرس بشكل أساسي Ratelimit - المحتوى ذي الصلة لاستخدام الجوافة لإجراء تقييد تدفق الواجهة ، على النحو التالي.
1. وصف المشكلة
في يوم من الأيام ، وجد السيد A فجأة أن عدد طلبات واجهته زاد فجأة إلى 10 مرات في السابق. لم يمض وقت طويل بعد ذلك ، كانت الواجهة غير صالحة للاستعمال تقريبًا وأثارت سلسلة من التفاعلات التي تسببت في انهيار النظام بأكمله. كيف تتعامل مع هذا الموقف؟ تعطينا الحياة الإجابة: على سبيل المثال ، تم تجهيز المفاتيح القديمة مع الصمامات. بمجرد أن يستخدم شخص ما معدات فائقة الطاقة العالية ، سيتم تفجير الصمامات لحماية كل جهاز من حرقه بواسطة تيار قوي. وبالمثل ، يجب أيضًا تثبيت واجهتنا مع "فتيل" لمنع شلل النظام الناجم عن الضغط المفرط على النظام من خلال الطلبات غير المتوقعة. عندما تكون حركة المرور كبيرة جدًا ، يمكن اعتماد آليات مثل الرفض أو الصرف.
2. خوارزميات الحد الحالية شائعة الاستخدام
هناك نوعان من خوارزميات الحد التيار شائع الاستخدام: خوارزمية دلو متسربة وخوارزمية دلو رمزية.
فكرة خوارزمية دلو التسريب بسيطة للغاية. الرجاء إدخال دلو التسريب أولاً. سوف يخرج دلو التسريب بسرعة معينة. عندما يكون طلب المياه كبيرًا جدًا ، فإنه سيخفق مباشرة. يمكن ملاحظة أن خوارزمية دلو التسرب يمكن أن تحد قسراً من معدل نقل البيانات.
الشكل 1 الشكل التخطيطي لخوارزمية دلو تسرب
بالنسبة للعديد من سيناريوهات التطبيق ، بالإضافة إلى القدرة على الحد من متوسط معدل النقل للبيانات ، يلزم أيضًا السماح بدرجة معينة من نقل الانفجار. في هذا الوقت ، قد لا تكون خوارزمية دلو التسرب مناسبة ، وخوارزمية دلو الرمز المميز أكثر ملاءمة. كما هو مبين في الشكل 2 ، فإن مبدأ خوارزمية دلو الرمز المميز هو أن النظام سيضع رمزًا في الدلو بسرعة ثابتة. إذا كان هناك حاجة إلى معالجة الطلب ، فمن الضروري الحصول على رمز من الدلو أولاً. عندما لا يكون هناك رمز في الدلو ، سيتم رفض الخدمة.
الشكل 2 الشكل 2 مخطط تخطيطي لخوارزمية دلو الرمز المميز
3. Ratelimiter في فئة أدوات الحد الحالية
توفر مجموعة أدوات Google Open Source Guava فئة Ratelimiter ، والتي تعتمد على "خوارزمية دلو الرمز" وهي مريحة للغاية للاستخدام. للاستخدام المحدد لهذه الواجهة الفئة ، يرجى الرجوع إلى ممارسة استخدام Ratelimiter.
Ratelimiter باستخدام العرض التوضيحي
حزمة ratelimite ؛ import com.google.common.util.concurrent.ratelimiter ؛ الطبقة العامة ratelimiterdemo {public static void main (string [] args) {testnoratelimiter () ؛ <10 ؛ يتم تقديم المهام في الثانية الواحدة لـ (int i = 0 ؛ i <10 ؛ i ++) {limiter.acquire () ؛ // طلب ratelimiter ، سيتم حظر التصاريح المتجاوز system.out.println ("call execute .."+i) ؛ أربعة توافق في الجوافة: مثال على الاستماع و ratelimiter
مفهوم
الاستماع Future ، كما يوحي الاسم ، هو مستقبل يمكن الاستماع إليه ، إنه تعزيز ممتد لمستقبل جافا الأصلي. نعلم أن المستقبل يمثل مهمة حساب غير متزامنة ، ويمكن الحصول على نتائج الحساب عند اكتمال المهمة. إذا أردنا الحصول على النتائج وعرضها على المستخدم بمجرد اكتمال الحساب أو إجراء حسابات أخرى ، فيجب علينا استخدام مؤشر ترابط آخر للاستعلام باستمرار عن حالة الحساب. هذا يجعل الكود معقد وغير فعال. استخدم Guava القابلة للاستماع Future لمساعدتنا في اكتشاف ما إذا كان المستقبل قد اكتمل. إذا تم الانتهاء منها ، فسيتم استدعاء وظيفة رد الاتصال تلقائيًا ، والتي يمكن أن تقلل من تعقيد البرنامج المتزامن.
ينصح الطريقة الثانية ، لأن الطريقة الثانية يمكن أن تحصل مباشرة على قيمة إرجاع المستقبل أو أخطاء المقبض. في جوهرها ، يتم تحقيق الطريقة الثانية من خلال تعبئة الطريقة الأولى ويتم إجراء مزيد من التغليف.
بالإضافة إلى ذلك ، يحتوي ListenableFuture على العديد من التطبيقات المدمجة الأخرى:
CountableFuture: ليست هناك حاجة لتنفيذ طريقة لحساب قيمة الإرجاع ، ولكن هناك حاجة فقط إلى قيمة ثابتة للعودة كقيمة الإرجاع. يمكنك تعيين قيمة الإرجاع أو معلومات الاستثناء لهذا المستقبل من خلال البرنامج.
CheckedFuture: هذا ورث من واجهة الاستماع Future. يوفر طريقة checkedget (). يمكن أن تلقي هذه الطريقة استثناء من النوع المحدد عند حدوث استثناء في التنفيذ في المستقبل.
يشبه Ratelimiter Semaphore's JDK. يتم استخدامه للحد من عدد المواضيع للوصول إلى الموارد بشكل متزامن. تقدم هذه المقالة استخدام Ratelimiter.
مثال رمز
استيراد java.util.concurrent.callable ؛ import java.util.concurrent.executionException ؛ import java.util.concurrent.executors com.google.common.util.concurrent.futures ؛ import com.google.common.util.concurrent.listenablefuture ؛ import com.google.common.util.concurrent.listeningexecutorservice ؛ import com.common.util.concurrent.morexecutors ؛ com.google.common.util.concurrent.ratelimiter ؛ الطبقة العامة stistableFuteruredemo {public static void main (string [] args) {testratelimiter () testrateLimiter () {annarexecutorservice evelysorservice = moreExecutors .listingDecorator (evelivors.newcachedthreadpool ()) ؛ rateLimiter limiter = ratelimiter.create (5.0) ؛ // لا أكثر من 4 من المهام التي يتم تقديمها في الثانية (int i = 0 ؛ i <10 ؛ سيتم حظر التصاريح المتجاوز النهائي للاستماع future <integer> stiNedfuture = ExecutorService .Submit (مهمة جديدة ("IS"+ I)) ؛}} public static void testlisterenable () {stareExecutorServiceRvicevice = moreExecutors .listeningDecorator. Final inchistablefuture <integer> stiNedFuture = ExecutorService .Submit (مهمة جديدة ("TestListenableFuture")) ؛ {e1.printstacktrace () ؛} // أول طريقة stiNedfuture.addListener (new RunNable () {Override public void run () {try {system.out.println ( ExecutorService) ؛ // الطريقة الثانية Futures.AddCallback (الاستماع القابلة للاستماع ، FutureCallback جديد <integer> () {Override public void onsuccess (نتيجة integer) {system.out. {t.printStackTrace () ؛}}) ؛}} تنفذ مهمة الفئة القابلة للاتصال <integer> {String str ؛ Task Public (String str) {this.str = str ؛}@override public integer call () rems {system.out.println ("call execute .." + str) ؛نسخة الجوافة
<Rependency> <roupeD> com.google.guava </rougiD> <StifactId> goaava </stifactid> <الإصدار> 14.0.1 </الإصدار> </التبعية>
لخص
ما ورد أعلاه هو كل شيء عن Ratelimit - باستخدام الجوافة لجعل واجهة الحد من رمز الحد الأقصى. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!