现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

常见容错机制:failfast、failsafe、failover、failback

2019-10-05 08:28 工业·编程 ⁄ 共 1759字 ⁄ 字号 暂无评论

failfast(快速故障)
描述:

如果出现故障,则立即报错。
通常用于非幂等性操作,如:下单操作,如果写入故障,则立即报错,不必重试。
示例:

    /**
     * fail-fast: 快速故障
     */
    public Object failFast() {
        //保存订单
        boolean result = MajorExternalService.saveOrder();

        if (result) {
            return "success";
        } else {
            //fail-fast
            throw new IllegalStateException("下单失败!");
        }
    }

failsafe(故障安全)
描述:

如果出现故障,则可以忽略,因为这种故障不会造成损失或损失在可接受范围内。
通常用于辅助性操作,如:写入监控日志,如果写入故障,则忽略。
示例:

    /**
     * fail-safe: 故障安全
     */
    public Object failSafe() {
        //写入日志
        boolean result = MajorExternalService.saveLog();

        if (result) {
            return "success";
        } else {
            //fail-safe
            return "failed";
        }
    }

failover(故障切换)
描述:

如果出现故障,则重试备份操作模式。
通常用于幂等性操作,如:MySql的双Master模式,如果主Master故障,则切换至从Master。
重试通常会带来更多延时。
示例:

/**
     * 默认情况下使用主要外部服务MajorExternalService
     */
    private static boolean isMajorOK = true;

    /**
     * fail-over: 故障切换
     */
    public Object failOver() {
        //读取商品信息
        Object goodsInfo;

        //默认情况下使用主要外部服务
        if (isMajorOK) {
            try {
                goodsInfo = MajorExternalService.getGoodsInfo();
            } catch (Exception e) {
                //fail-over: 调用主要外部服务发生故障,则切换为备用外部服务
                isMajorOK = false;
                goodsInfo = MinorExternalService.getGoodsInfo();
            }
        } else {
            //
            goodsInfo = MinorExternalService.getGoodsInfo();
        }

        return goodsInfo;
    }
failback(故障恢复)
描述:

故障切换之后,如果主要操作模式恢复,则自动从备份操作模式恢复主要操作模式。
如:MySql的双Master模式,如果主Master故障,则failover至从Master;当主Master恢复之后,则自动切换至主Master。
示例:

    /**
     * fail-back: 故障恢复
     */
    public void failBack() {
        //一直在监测主要外部服务的状态
        while (true) {
            //通过某些方法得知主要外部服务已经恢复了
            if (confirmMajorIsOk()) {
                //fail-back
                isMajorOK = true;
                break;
            }
        }
    }

给我留言

留言无头像?