博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊apache gossip的FailureDetector
阅读量:7100 次
发布时间:2019-06-28

本文共 2755 字,大约阅读时间需要 9 分钟。

  hot3.png

本文主要研究一下apache gossip的FailureDetector

FailureDetector

incubator-retired-gossip/gossip-base/src/main/java/org/apache/gossip/accrual/FailureDetector.java

public class FailureDetector {  public static final Logger LOGGER = Logger.getLogger(FailureDetector.class);  private final DescriptiveStatistics descriptiveStatistics;  private final long minimumSamples;  private volatile long latestHeartbeatMs = -1;  private final String distribution;  public FailureDetector(long minimumSamples, int windowSize, String distribution) {    descriptiveStatistics = new DescriptiveStatistics(windowSize);    this.minimumSamples = minimumSamples;    this.distribution = distribution;  }  /**   * Updates the statistics based on the delta between the last   * heartbeat and supplied time   *   * @param now the time of the heartbeat in milliseconds   */  public synchronized void recordHeartbeat(long now) {    if (now <= latestHeartbeatMs) {      return;    }    if (latestHeartbeatMs != -1) {      descriptiveStatistics.addValue(now - latestHeartbeatMs);    }    latestHeartbeatMs = now;  }  public synchronized Double computePhiMeasure(long now) {    if (latestHeartbeatMs == -1 || descriptiveStatistics.getN() < minimumSamples) {      return null;    }    long delta = now - latestHeartbeatMs;    try {      double probability;      if (distribution.equals("normal")) {        double standardDeviation = descriptiveStatistics.getStandardDeviation();        standardDeviation = standardDeviation < 0.1 ? 0.1 : standardDeviation;        probability = new NormalDistributionImpl(descriptiveStatistics.getMean(), standardDeviation).cumulativeProbability(delta);      } else {        probability = new ExponentialDistributionImpl(descriptiveStatistics.getMean()).cumulativeProbability(delta);      }      final double eps = 1e-12;      if (1 - probability < eps) {        probability = 1.0;      }      return -1.0d * Math.log10(1.0d - probability);    } catch (MathException | IllegalArgumentException e) {      LOGGER.debug(e);      return null;    }  }}
  • FailureDetector的构造器接收三个参数,分别是minimumSamples, windowSize, distribution
  • 其中minimumSamples表示最少需要多少统计值的时候才真正计算phi值,windowSize表示统计窗口的大小,distribution表示使用哪种分布,normal表示NormalDistribution,其他表示ExponentialDistribution
  • FailureDetector使用了apache commons math的DescriptiveStatistics来作为Heartbeat Interval的时间窗口统计;使用了NormalDistribution、ExponentialDistribution来完成正态分布、指数分布的累积分布probability,最后使用公式-1.0d * Math.log10(1.0d - probability)来计算phi值

小结

  • 论文提出了基于phi值的Accrual Failure Detector方法
  • 业界关于Failure Detector的实现大致有两种,一种是以akka为代表的按照论文基于NormalDistribution来计算;一种是以cassandra为代表的基于ExponentialDistribution来计算
  • apache gossip的FailureDetector则集大成地同时支持了NormalDistribution及ExponentialDistribution两种实现方式

doc

转载于:https://my.oschina.net/go4it/blog/3044937

你可能感兴趣的文章
探讨跨域请求资源的几种方式
查看>>
Mysql 知识(3)
查看>>
万网云解析设置二级域名解析到同IP不同端口
查看>>
CSS浏览器兼容问题
查看>>
Gitlab_ansible_jenkins三剑客⑥Jenkins和ansible集成
查看>>
我的Python成长之路---第三天---Python基础(10)---2016年1月16日(雾霾)
查看>>
通过哪些方式可以降低网站的跳出率
查看>>
node.js结合mongodb
查看>>
Leetcode题目:Remove Duplicates from Sorted List
查看>>
Python基础之Python解释器
查看>>
[Java小程序]聊天室——Socket和ServerSocket的使用
查看>>
metamask源码学习-inpage.js
查看>>
《冷眼看IT》读书笔记--IT将成为服务行业
查看>>
iOS开发-面试总结(十七)
查看>>
改变注释字体颜色
查看>>
indexOf()、lastIndexOf()
查看>>
HDU2044 一只小蜜蜂...
查看>>
POJ2780 Linearity
查看>>
解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX
查看>>
Vue打包npm run build 打包后空白怎么解决?
查看>>