分布式系统架构Quorum算法和实现上的坑

原文链接: https://juejin.im/post/5d5b44ecf265da038f480ea6

一、引言(业务场景)

    先简单说说线上生产系统的一个背景,因为仅仅是文章作为案例来讲,所以弱化大量的业务背景。

简单来说,这是一套分布式系统,系统A需要将一个非常核心以及关键的数据通过网络请求,传输给另外一个系统B。

所以这里其实就考虑到了一个问题,如果系统A刚刚将核心数据传递给了系统B,结果系统B莫名其妙宕机了,岂不是会导致数据丢失?

所以在这个分布式系统的架构设计中,采取了非常经典的一个Quorum算法

二、算法简介

    quorum值 = (系统节点数 / 2 ) + 1 

    B系统必须部署奇数台节点,A系统每次向B系统发送数据都必须给B系统中的每个节点发送一次。A系统判断本次数据发送成功与否的依据是,指定时间内,B系统中至少有quorum台节点回复了ACK。即B系统中超过半数的节点接受成功。

    该机制在很多分布式系统、中间件都有广泛的使用。

    quorum机制架构图:

分布式系统架构Quorum算法和实现上的坑_第1张图片

三、核心代码

​
// 获取到系统B的Quorum值 (n / 2) + 1
int quorum = countQuorum();

// 从配置文件加载设置的超时时间
long timeoutThreshold = configuration.get();

// 根据当前时间计算预计的过期时间
long expireTime = currentTime() + timeoutThreshold;

// 将数据异步写入B系统
service.wirteAsyn(data);

while(true) {
    // 收到了quorum个ACK,认为写入成功
    if (countAvailableResponse() > quorum) {
        break;
    } 
    
    // 获取当前时间
    long now = currentTime();

    // 若超时,因为A系统严重依赖B系统,B系统无法响应时,A系统也必须连带停机
    if ( now > expireTime) {
        Logger.error("B系统故障,无法传输数据,系统A自动退出);
        System.exit(1);
    }

    // 若未收到quorum个ACK,且未超时,则休眠一定时间再次检查
    Thread.sleep(1000);
}

​

 

你可能感兴趣的:(java,架构)