架构设计互联网架构

架构设计04--设计原则02--快速失败

2020-03-27  本文已影响0人  Wales_Kuo

架构设计系列文章,请参见连接。

背景

软件研发过程中一个根本性的问题:为什么要做软件(架构)设计?在软件开发过程中软件设计可以分为两个方面:业务设计,技术设计。而业务设计关系着业务能力,业务服务内容,所以业务设计是必须的。也就是软件业务设计定义了软件要解决现实生活中的问题,如果没有这个问题我们也不需要去研发软件了。而对于软件设计来说技术设计是不是就变成一个可有可无的东西?

在大多数软件团队中都处于没有技术设计的阶段。而这样的阶段就会形成它独特的特点:

这几个特点对业务来说是致命的。严重的影响着业务的持续发展能力,不能支撑业务的发展。这是一种因为对于技术的忽略而反推到对业务发展的不负责的一种思路。因为技术是支撑业务的,但是在支撑业务过程中不考虑架构的事情就会反响的影响业务的持续发展。

快速失败就是一个能够体现技术架构设计影响业务发展的一个例子。下面具体说明快速失败用怎样的方式影响业务的发展。

快速失败的层次

对于软件系统来说,系统化的管理是必不可少的。而快速失败也体现在系统化管理的各个层面上。这里我将应用快速失败的系统化管理的层面分为:业务规划层,系统层,服务间通信层,代码层。在每一层中都有它独特的快速失败方法。而在不同的层面间共享的Fail-fast原则有着一些共同的特点。

Wiki上对于快速失败的定义:

在系统设计中,Fail-fast系统是指在接口处立即报告任何可能指示故障的情况的系统。Fail-fast系统通常设计为停止正常运行,而不是试图继续一个可能有缺陷的过程。这样的设计经常在一个操作中的几个点检查系统的状态,因此任何故障都可以早期检测到。Fail-fast模块的职责是检测错误,然后让系统的下一个最高级别处理错误。

它们的共同点就是在边界处进行处理并报错。以最快的速度响应,以提高性能与可靠性。

How to Works?

对于快速失败后,问题应该怎样解决?上图为在发生快速错误时的解决方案,在快速失败的情况去给各方一个快速反馈。以快速反馈的方式反馈出错误原因,这样可以更有针对性的进行问题解决工作。

技术

上面基本上已经说明了在不同的层面上需要哪些快速失败的方法。这里主要进行快速失败技术方面的讨论。针对技术层面上可能需要考虑负载均衡器的快速失败,服务健康度检测技术,参数验证框架等内容。

实践

RetryTemplate template = new RetryTemplate();

TimeoutRetryPolicy policy = new TimeoutRetryPolicy();
policy.setTimeout(30000L);

template.setRetryPolicy(policy);

Foo result = template.execute(new RetryCallback<Foo>() {

    public Foo doWithRetry(RetryContext context) {
        // Do stuff that might fail, e.g. webservice operation
        return result;
    }

});

总结

快速失败对于架构设计来说是一个需要遵循的原则。不过也可以将快速失败原作推而广之到生产、生活的各个方面,指导我们的日常工作、生活。在于技术层面快速失败可以为软件系统的可靠性,性能方面提供很好的支撑作用。可以在不同的软件层面践行这个原则。

参考:

快速失败的能力
构建可靠系统的原则与实践
构建可靠的系统
云原生架构及设计原则
监控什么?4个黄金指标/RED方法/USE方法
突破Java面试-hystrix分布式系统可用性及设计原则
如何健壮你的后端服务?
性能-快速失败与稳健性
Wikipedia:Fail-fast

面试官:说说快速失败和安全失败是什么
快速失败(fail-fast)和安全失败(fail-safe)

上一篇下一篇

猜你喜欢

热点阅读