我一直对 Web 开发和软件架构感兴趣,因为我喜欢看到一个工作系统的更广阔图景。 无论您构建的是移动应用程序还是 Web 应用程序,它都必须连接到互联网才能在不同模块之间交换数据,这意味着您需要 Web 服务。
如果您使用云系统作为应用程序的后端,则可以利用更强大的计算能力,因为后端服务将水平和垂直扩展并协调不同的服务。 但是,无论您是否使用云后端,构建容错系统——一个具有弹性、稳定、快速和安全的系统——都非常重要。
为了理解容错系统,让我们以 Facebook、亚马逊、谷歌和 Netflix 为例。 数百万甚至数十亿用户同时访问这些平台,同时通过点对点和用户到服务器网络传输大量数据,您可以确信也有心怀不轨的恶意用户,例如黑客攻击或拒绝服务 (DoS) 攻击。 尽管如此,这些平台仍可以每天 24 小时、每年 365 天不间断运行。
尽管机器学习和智能算法是这些系统的支柱,但它们在没有一分钟停机的情况下实现一致服务这一事实值得称赞。 它们昂贵的硬件和庞大的数据中心固然重要,但支持这些服务的优雅软件设计也同样重要。 而容错系统是构建如此优雅的系统原则之一。
生产中导致问题的两种行为
这里有另一种思考容错系统的方式。 当您在本地运行应用程序服务时,一切似乎都很好。 太棒了! 但是当您将服务提升到生产环境时,一切都乱了套。 在这种情况下,容错系统通过解决两个问题来提供帮助:故障停止行为和拜占庭行为。
故障停止行为
故障停止行为是指正在运行的系统突然停止或系统的某些部分发生故障。 服务器停机和数据库不可访问都属于此类。 例如,在下图中,服务 1 无法与服务 2 通信,因为服务 2 不可访问

由于服务 2 停机导致的故障停止行为
但是,如果服务之间存在网络问题,也可能发生问题,如下所示

由于网络故障导致的故障停止行为
拜占庭行为
拜占庭行为是指系统持续运行,但不产生预期行为(例如,错误的数据或无效的值)。
即使服务看起来运行良好,如果服务 2 的数据或值已损坏,也可能发生拜占庭故障,如下例所示

由于服务损坏导致的拜占庭故障
或者,可能存在恶意中间人拦截服务之间并注入不需要的数据

由于恶意中间人导致的拜占庭故障
故障停止行为和拜占庭行为都不是理想的情况,因此我们需要方法来预防或修复它们。 这就是容错系统发挥作用的地方。 以下是八种可以帮助您解决这些问题的开源工具。
用于构建容错系统的工具
虽然构建真正实用的容错系统涉及深入的分布式计算理论和复杂的计算机科学原理,但有很多软件工具——其中许多是开源的,如下所示——可以通过构建容错系统来减轻不良结果。
断路器模式:Hystrix 和 Resilience4j
断路器模式是一种技术,当服务失败时,它有助于返回预先准备的虚拟响应或简单响应

断路器模式
Netflix 的开源 Hystrix 是断路器模式最流行的实现。
我以前工作过的许多公司都在利用这个出色的工具。 令人惊讶的是,Netflix 宣布将不再更新 Hystrix。 (是的,我知道。)相反,Netflix 建议使用替代解决方案,例如 Resilence4j,它支持 Java 8 和函数式编程,或者替代实践,例如 自适应并发限制。
负载均衡:Nginx 和 HaProxy
负载均衡是分布式系统中最基本的概念之一,并且必须存在才能拥有生产质量的环境。 要理解负载均衡器,我们首先需要理解冗余的概念。 每个生产质量的 Web 服务都有多个服务器,这些服务器提供冗余,以便在服务器宕机时接管并维护服务。

想想现代飞机:它们的双引擎提供冗余,即使一个引擎着火,它们也能安全着陆。 (大多数商用飞机都拥有最先进的自动化系统也有帮助。)但是,拥有多个引擎(或服务器)意味着必须有某种调度机制,以便在发生故障时有效地路由系统。
负载均衡器是一种设备或软件,通过平衡多个服务器节点来优化繁重的流量事务。 例如,当数千个请求涌入时,负载均衡器充当中间层来路由并在不同服务器之间均匀分配流量。 如果服务器宕机,负载均衡器会将请求转发到其他运行良好的服务器。
有许多负载均衡器可用,但最著名的两个是 Nginx 和 HaProxy。
Nginx 不仅仅是一个负载均衡器。 它是一个 HTTP 和反向代理服务器、邮件代理服务器以及通用 TCP/UDP 代理服务器。 Groupon、Capital One、Adobe 和 NASA 等公司都在使用它。
HaProxy 也非常流行,因为它是一个免费、非常快速且可靠的解决方案,为基于 TCP 和 HTTP 的应用程序提供高可用性、负载均衡和代理。 许多大型互联网公司,包括 GitHub、Reddit、Twitter 和 Stack Overflow,都在使用 HaProxy。 哦,对了,Red Hat Enterprise Linux 也支持 HaProxy 配置。
Actor 模型:Akka
Actor 模型是一种并发设计模式,当actor(一种计算的基本单元)收到消息时,它会委托责任。 Actor 可以创建更多 actor 并将消息委托给它们。
Akka 是 actor 模型实现中最著名的工具之一。 该框架支持 Java 和 Scala,它们都基于 JVM。
使用消息队列的异步、非阻塞 I/O:Kafka 和 RabbitMQ
多线程开发过去很流行,但这种做法已被劝阻,并被异步、非阻塞 I/O 模式所取代。 对于 Java,这在其 企业 Java Bean (EJB) 规范中明确指出
“企业 Bean 不得使用线程同步原语来同步多个实例的执行。
“企业 Bean 不得尝试管理线程。 企业 Bean 不得尝试启动、停止、挂起或恢复线程,或更改线程的优先级或名称。 企业 Bean 不得尝试管理线程组。”
现在,还有其他实践,如流 API 和 Actor 模型。 但是,像 Kafka 和 RabbitMQ 这样的消息队列为异步和非阻塞 IO 功能提供了开箱即用的支持,它们是强大的开源工具,可以通过处理并发进程来替代线程。
其他选项:Eureka 和 Chaos Monkey
用于容错系统的其他有用工具包括监控工具,例如 Netflix 的 Eureka,以及压力测试工具,例如 Chaos Monkey。 它们旨在通过在较低环境(如集成 (INT)、质量保证 (QA) 和用户验收测试 (UAT))中进行测试来更早地发现潜在问题,以防止在迁移到生产环境之前出现潜在问题。
您正在使用哪些开源工具来构建容错系统? 请在评论中分享您的最爱。
6 条评论