flume之退避算法backoff algorithm[通俗易懂]

flume之退避算法backoff algorithm[通俗易懂]flume之退避算法backoffalgorithm什么是退避算法:Inasinglechannelcontentionbasedmediumaccesscontrol(MAC)protocols,whenevermorethanonestationornodetriestoaccessthemediumatthesameinstantof…

大家好,又见面了,我是你们的朋友全栈君。

什么是退避算法:

In a single channel contention based medium access control (MAC) protocols, whenever more than one station or node tries to access the medium at the same instant of time, it leads to packet collisions. If the collided stations tries to access the channel again, the packets will collide as the nodes are synchrozied in time. So the nodes need to be displaced in time. To displace them temporally, a backoff algorithm is used (example binary exponential backoff (BEB)). For example, in BEB algorithm, whenever a node’s transmission is involved in a collision with another node’s transmission, both nodes will choose a random waiting time and wait for this amoiunt of time before attempting again. If they are not successful in this attempt, they double their contention window and choose a randoim waiting time before transmitting again. This process will be repeated for certain number of attempts. If the nodes are not successful in their transmission after this limit, the packets will be dropped from their queue.

大致意思是,在一个共享信道的情况下,当网络上的节点在发生冲突时,每个节点节点等待一定的时间后重新发送。在二进制指数退避算法中,等待时间随着以二为底的指数增长。如果重试失败,那么下次的等待时间将会是上次的等待时间二倍。如果重试次数大于最大重试次数,那么包将从包队列中去除。

我们认识了什么是退避算法之后,来看一下flume中对退避算法的应用。从退避算法的概念可知,该算法用在网络错误,重试的情况中,例如打开一个网络链接,向网络中发送数据等。在flume中,insistentAppend和insistentOpen封装器都用到了退避算法来处理网络的发送数据和链接打开过程。我们来通过insistentAppend中的append方法例子,看一下怎么对退避算法进行运用。

 

Java代码  

  1. public void append(Event evt) throws IOException, InterruptedException {  
  2.     List<IOException> exns = new ArrayList<IOException>();  
  3.     int attemptRetries = 0;  
  4.     appendRequests++;  
  5.     while (!backoff.isFailed() && isOpen.get()  
  6.         && !Thread.currentThread().isInterrupted()) {  
  7.       try {  
  8.         appendAttempts++;  
  9.         super.append(evt);  
  10.         appendSuccesses++;  
  11.         backoff.reset(); // reset backoff counter;  
  12.         return;  
  13.       } catch (InterruptedException ie) {  
  14.         throw ie;  
  15.       } catch (IOException e) {  
  16.         // this is an unexpected exception  
  17.         long waitTime = backoff.sleepIncrement();  
  18.         LOG.info(“append attempt “ + attemptRetries + ” failed, backoff (“  
  19.             + waitTime + “ms): “ + e.getMessage());  
  20.         LOG.debug(e.getMessage(), e);  
  21.         exns.add((e instanceof IOException) ? (IOException) e  
  22.             : new IOException(e));  
  23.         backoff.backoff();  
  24.         try {  
  25.           backoff.waitUntilRetryOk();  
  26.         } catch (InterruptedException e1) {  
  27.           // got an interrupted signal, bail out!  
  28.           throw e1;  
  29.         } finally {  
  30.           attemptRetries++;  
  31.           appendRetries++;  
  32.         }  
  33.       } catch (RuntimeException e) {  
  34.         // this is an unexpected exception  
  35.         LOG.info(“Failed due to unexpected runtime exception “  
  36.             + “during append attempt”, e);  
  37.         appendGiveups++;  
  38.         throw e;  
  39.       }  
  40.     }  
  41.     appendGiveups++;  
  42.     // failed to start  
  43.     IOException ioe = MultipleIOException.createIOException(exns);  
  44.     if (ioe == null) {  
  45.       return;  
  46.     }  
  47.     throw ioe;  
  48.   }  

 通过对以上代码抽象,一般采用以下形式来运用backoff算法。

 

Java代码  

  1. while (!backoff.isFailed()) {  
  2.           try {  
  3.             doSomething(); //do something  
  4.             backoff.reset(); // reset backoff counter;  
  5.             return;  
  6.           } catch (Exception e) {  
  7.             backoff.backoff();  
  8.             try {  
  9.               backoff.waitUntilRetryOk();  
  10.             } catch (InterruptedException e1) {         
  11.             }   
  12.          }  
  13.      }  

 

 目前在flume中主要运用了ExponentialBackoff,CappedExponentialBackoff,CumulativeCappedExponentialBackoff三种退避算法。

ExponentialBackOff是个简单的指数退避算法,仅仅让下次的等待时间是上次等待时间的2倍,当重试次数达到最大重试次数时,该任务将不能重试。

CappedExponentialBackoff对ExponentialBackOff算法作了简单的改造,该算法对每次的等待时间做了个限定,即每次的等待时间不超过某个值sleepCap。但该方法没有限定重试次数。

CumulativeCappedExponentialBackoff算法对CappedExponentialBackoff作了些改造,该算法加入了cumulativeCap变量,用来限制重试次数。在第一次backoff的时候设置failTime值为当前时间+cumulativeCap。是否可以重试由当前时间和failTime决定。当前时间小于failTime则表明还可以重试,否则,不能重试。

 

通过对以上的分析,可以得到一个Backoff算法必须提供四个接口(isFailed,backOff,waitUntilRetryOk,reset)。其中,isFailed用来判断是否可以重试,backoff用来设置等待时间,waitUntilRetryOk根据backoff设置的等待时间sleep,以便下次重试。reset的接口是在任务成功后,对backoff算法的一些变量重置。详细可以看ExponentialBackoff等源代码。

 

退避算法为我们在解决重试某项任务的时候,提供了一个比较好的等待思想。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149186.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 我在阿里采访五倍

    我在阿里采访五倍

  • systemproperties_安卓system下载

    systemproperties_安卓system下载该楼层疑似违规已被系统折叠隐藏此楼查看此楼android状态栏点击右上角锁屏教程1.反编辑systemUI.apk2.打开res\layout的status_bar.xml3.查找字符这段代码的上面一行加入以下代码android:layout_gravity=”right”androidrientation=”vertical”android:id=”@id/home”android:lay…

  • HTML5视频直播技术介绍

    HTML5视频直播技术介绍视频直播如火如荼,为了满足比较火热的移动Web端直播需求,一系列的HTML5直播技术迅速的发展了起来。只要实现了视频直播的各个技术难点,通过HTML5进行视频直播并非难事。常见的可用于HTML5的直播技术共有3种协议:HLS、WebSocket与WebRTC。本文将对基于这3种协议的HTML5直播技术实现做下基础的介绍。一.HLS优点:CDN支持比较好缺点

  • 数据结构 – 链表和数组的区别[通俗易懂]

    数据结构 – 链表和数组的区别[通俗易懂]文章目录数据结构-链表和数组的区别1、在内存上2、时间复杂度3、链表的结构4、各自的优缺点5、为什么使用较常用的是单头链表数据结构-链表和数组的区别1、在内存上数组是连续内存,因为是静态分配,所以不可扩容链表是非连续内存,动态分配,也没有顺序,它通过链表中的next指针保存逻辑顺序2、时间复杂度查找时间复杂度1、数组使用下标定位,1次就可以找到,O(1)2、链表需要循环去找,最大需要N次,O(N)插入删除时间复杂度1、数组插入删除需要移动其它元素,复杂度

    2022年10月28日
  • 在Ubuntu下使用workon时出现workon: command not found错误「建议收藏」

    在Ubuntu下使用workon时出现workon: command not found错误「建议收藏」然后执行1.接着,我们需要配置下~/.bashrc,将virtualenv添加进去:    即将:    exportWORKON_HOME=$HOME/.virtualenvs    source/usr/local/bin/virtualenvwrapper.sh    复制到~/.bashrc中,保存退出2.让bashrc生效:执行source~/.bashrc命令…

  • xshell下载安装教程_xshell命令连接ip

    xshell下载安装教程_xshell命令连接ipxshell下载链接:  http://www.netsarang.com/download/free_license.html         现今软件市场上有很多终端工具,比如:secureCRT、Putty、telnet、xshell\等等。secureCRT是一款很强大的终端工具,但是,它毕竟是收费软件,在公司里不允许使用。而且在自己的电脑里一旦输入大写,整个界面就乱了(原因未知,未…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号