В этой статье в основном изучаются Ratelimit - соответствующее содержание использования Guava для выполнения ограничения потока интерфейса, следующим образом.
1. Описание проблемы
Однажды мистер внезапно обнаружил, что количество запросов на его интерфейс внезапно увеличился до 10 раз превышает предыдущий. Вскоре после этого граница раздела был почти непригодным для использования и вызвал цепную реакцию, которая привела к разрушению всей системы. Как справиться с этой ситуацией? Жизнь дает нам ответ: например, старомодные переключатели оснащены предохранителями. После того, как кто-то использует сверхмощное оборудование, предохранитель будет взорван, чтобы защитить каждое устройство от сожженного сильным током. Аналогичным образом, наш интерфейс также должен быть установлен с «предохранителем», чтобы предотвратить паралич системы, вызванный чрезмерным давлением на систему непредвиденными запросами. Когда движение слишком велик, могут быть приняты такие механизмы, как отказ или дренаж.
2. Обычно используемые алгоритмы ограничивающих тока
Существуют два часто используемых алгоритма, ограничивающих ток: алгоритм протекания ковша и алгоритм токена.
Идея алгоритма протекающего ведра очень проста. Пожалуйста, сначала введите протекающее ведро. Протекающее ведро выйдет с определенной скоростью. Когда запрос на воду слишком велик, он будет переполнен. Можно видеть, что алгоритм утечки ковша может насильно ограничивать скорость передачи данных.
Рисунок 1 Схематическая схема алгоритма просочившегося ведра
Для многих сценариев применения, в дополнение к возможности ограничить среднюю скорость передачи данных, также необходимо обеспечить некоторую степень передачи взрыва. В настоящее время алгоритм просочившегося ковша может быть не подходит, а алгоритм ковша токена более подходит. Как показано на рисунке 2, принцип алгоритма ковша токена состоит в том, что система поместит токен в ведро с постоянной скоростью. Если запрос должен быть обработан, необходимо сначала получить токен из ведра. Когда в ведре нет токена, обслуживание будет отказано.
Рисунок 2 Схематическая схема алгоритма ковша токена
3. RateLimiter в классе с ограниченным инструментом тока
Google с открытым исходным кодом Guava предоставляет класс RateLimiter, который основан на «алгоритме ковша токена» и очень удобен в использовании. Для конкретного использования этого интерфейса класса, пожалуйста, обратитесь к практике использования RateLimiter.
RateLimiter с использованием демонстрации
пакет ratelimite; import com.google.common.util.concurrent.ratelimiter; открытый класс ratelimiterdemo {public static void main (string [] args) {testnoratelimiter (); testwithratelimiter ();} public static void testnorAtelimiter () {long start = system.currenttim testnorTimiter () {Long Sstarm. 10; Задачи в секунду отправляются для (int i = 0; i <10; i ++) {limiter.acquire (); // rateLimiter atelimiter, превышение Четыре параллелизма гуавы: пример прослушиваемого и рапилитра
концепция
Прослушиваемая номера, как следует из названия, - это будущее, которое можно прослушать, это расширенное улучшение будущего Ява. Мы знаем, что будущее представляет собой задачу асинхронного расчета, и результаты расчета могут быть получены при выполнении задачи. Если мы хотим получить результаты и отобразить их пользователю после завершения расчета или выполнять другие вычисления, мы должны использовать другой поток, чтобы постоянно запросить статус расчета. Это делает код сложным и неэффективным. Используйте Guava SlustableFuture, чтобы помочь нам определить, завершено ли будущее. Если он будет завершен, функция обратного вызова будет автоматически вызвана, что может уменьшить сложность параллельной программы.
Второй метод рекомендуется, потому что второй метод может напрямую получить возвращаемое значение будущего или обработки ошибок. По сути, второй метод достигается путем мобилизации первого метода, и выполняется дальнейшая инкапсуляция.
Кроме того, у прослушиваемой функции есть несколько других встроенных реализаций:
SetableFuture: нет необходимости реализовать метод для расчета возвращаемого значения, но для возврата необходимо только фиксированное значение в качестве возврата. Вы можете установить информацию о возврате или исключении этого будущего через программу.
CheckedFuture: Это унаследован от интерфейса прослушивания. Он предоставляет метод чекеджета (). Этот метод может сделать исключение указанного типа, когда произойдет исключение в будущем выполнении.
RateLimiter похож на семафор JDK. Он используется для ограничения количества потоков для доступа одновременно к ресурсам. Эта статья представляет использование RateLimiter.
Пример кода
import java.util.concurrent.callable; import java.util.concurrent.executionexception; import java.util.concurrent.executors; import java.util.concurrent.timeUnit; import Com.google.common.corl com.google.common.util.concurrent.listenablefuture; import com.google.common.util.concurrent.listeningexecutorservice; импорт com.google.common.util.concurrent.moreexecutors; импорт com.google.common.util.concurrent.ratelimiter; public userablefutabledemo {public sticle.concurrent.ratelimiter; public userablefulabureDemo {public voide. voids voids void. {testratelimiter ();; testlistenablefuture ();}/*** rateLimiter аналогичен семестру JDK Semester, который используется для ограничения количества потоков одновременным доступом к ресурсам*/public void testratelimiter () {hellistexecutorservice executorservice = morexecutors .listeningDecorator (expertors.newcachedThreadpool ()); RateLimiter Limiter = RateLimiter.Create (5.0); // не более 4 задач представлены в секунду для (int i = 0; i <10; i ++) {Limiter.acquire (); // ressurefure atelimit executorservice .submit (new Task ("is"+ i));}} public static void testlistenablefuture () {histustExecutorservice executorservice = methexecutors .listengingDecorator (experators.newcachedthreadpool ()); Окончательный прослушиваемой кв. {e1.printstacktrace ();} // Первый способ прослушивания future.addlistener (new Runnable () {@override public void run () {try {System.out.println ("Get Healling Future 'Result" + Slustablefuture.get ());} Catchtexception e) {e.printcktrace ();); executorservice); // Второй способ futures.addcallback (слушай, что можно было {t.printstacktrace ();}});}} Задача класса реализует Callable <Integer> {String Str; public task (String str) {this.str = str;}@переопределить публичный integer call () throws exception {system.out.println ("call execute .." + str);Гуава версия
<dependency> <groupid> com.google.guava </groupid> <artifactid> guava </artifactid> <sersion> 14.0.1 </version> </gethyse>
Суммировать
Выше приведено все о RateLimit - использование Guava, чтобы сделать примеры ограничения тока интерфейса. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!