我一直对 web 开发和软件架构很感兴趣, 因为我希望对一个可以工作的系统有一个整体的了解. 无论你正在构建移动应用程序还是 Web 应用程序, 它都必须连接到互联网, 以便在不同的模块之间交换数据, 这意味着你需要一个 Web 服务.
如果使用云系统作为应用程序的后端, 则可以利用更强大的计算能力, 因为后端服务可以横向和纵向伸缩, 并编排不同的服务. 但是, 无论你是否使用云后端, 构建一个 容错系统 都是非常重要的 -- 一个有弹性, 稳定, 快速和安全的容错系统.
为了理解容错系统, 让我们以 Facebook,Amazon, 谷歌和 Netflix 为例. 数以百万计的用户同时访问这些平台, 同时通过点对点和用户服务器 (user-to-server) 网络传输大量数据, 而且可以肯定, 其中有恶意用户, 比如黑客攻击或拒绝服务攻击(DoS). 即便如此, 这些平台仍然可以一天 24 小时, 一年 365 天不停机地运行.
尽管机器学习和智能算法是这些系统的核心, 但它们能够在没有一分钟停机的情况下实现一致的服务, 这一点值得称赞. 它们昂贵的硬件和庞大的数据中心当然很重要, 但支持这些服务的优雅的软件设计也同样重要. 而容错系统正是构建这样一个优雅系统的原则之一.
两种导致生产问题的行为
这里有另一种考虑容错系统的方式. 当你在本地运行应用程序服务时, 一切似乎都很好. 太棒了! 但是, 当你将你的服务推到生产环境时, 一切都乱了套. 在这种情况下, 容错系统有助于解决两个问题: 故障停止行为 (Fail-stop behavior) 和拜占庭行为(Byzantine behavior).
故障停止行为
故障停止行为是指正在运行的系统突然停止或部分系统发生故障. 服务器停机和数据库不可访问属于这一类. 例如, 在下面的图中, Service 1 不能与 Service 2 通信, 因为 Service 2 是不可访问的:
但是, 如果服务之间存在网络问题, 也会出现这种问题, 如下所示:
拜占庭行为
拜占庭行为是指系统持续运行, 但没有产生预期的行为(例如, 错误的数据或无效的值).
如果 Service 2 损坏了数据或值, 拜占庭式的故障就会发生, 即使服务看起来运行得很好, 就像在这个例子中:
或者, 可能有一个恶意的中间人在服务之间拦截并注入不需要的数据:
无论是故障停止还是拜占庭行为都不是我们想要的情况, 所以我们需要有方法可以防止或修复它们. 这就是容错系统发挥作用的地方. 以下 9 个开源工具可以帮助你解决这些问题.
构建容错系统的工具
尽管构建一个真正实用的容错系统涉及到深入的 分布式计算理论 和复杂的计算机科学原理, 但是有许多软件工具 -- 其中有许多是开源工具, 如下面这些 -- 可以通过构建容错系统来减轻不良影响.
断路器模式: Hystrix 和 Resilience4j
断路器模式 https://martinfowler.com/bliki/CircuitBreaker.html 是一种技术, 在服务失败时帮助返回一个准备好的虚拟响应或简单响应:
Netflix 开源的 https://github.com/Netflix/Hystrix/wiki 是最流行的断路器模式实现.
我以前工作过的许多公司都在使用这个很棒的工具. 令人惊讶的是, Netflix 宣布将不再更新 Hystrix.(是的, 我知道.)相反, Netflix 建议使用另一种解决方案, 如支持 Java 8 和函数式编程的 Resilence4j https://github.com/resilience4j/resilience4j , 或另一种方案 Adaptive Concurrency Limit .
负载均衡: Nginx 和 HaProxy
负载均衡是分布式系统中最基本的概念之一, 必须提供一个高质量的生产环境. 要理解负载均衡器, 首先需要理解 冗余 的概念. 每个生产质量的 Web 服务都有多个服务器以提供冗余, 以便在服务器宕机时接管和保持服务.
想想现代飞机: 它们的双引擎提供了冗余, 即使引擎着火也能安全着陆.(大多数商用飞机拥有最先进的自动化系统, 这也提供了帮助.)但是, 拥有多个引擎 (或服务器) 意味着必须有某种调度机制, 以便在发生故障时有效地路由系统.
负载均衡器是通过平衡多个服务器节点来优化高流量事务的设备或软件. 例如, 当数千个请求进来时, 负载均衡器充当中间层, 在不同的服务器之间路由和平均分配流量. 如果服务器宕机, 负载均衡器就将请求转发给运行良好的其他服务器.
有许多可用的负载均衡器, 但最著名的两个是 Nginx 和 HaProxy.
Nginx https://www.nginx.com/ 不仅仅是一个负载均衡器. 它还是 HTTP 和反向代理服务器, 邮件代理服务器和通用 TCP/UDP 代理服务器. Groupon,Capital One,Adobe 和 NASA 等公司都在使用它.
HaProxy https://www.haproxy.org/ 也很受欢迎, 因为它是一个免费的, 非常快速和可靠的解决方案, 为基于 TCP 和 HTTP 的应用程序提供高可用性, 负载均衡和代理. 许多大型互联网公司, 包括 GitHub,Reddit,Twitter 和 Stack Overflow 都在使用 HaProxy. 是的, Red Hat Enterprise Linux 也支持 HaProxy 配置.
Actor 模型: Akka
Actor 模型 https://en.wikipedia.org/wiki/Actor_model 是一种并发设计模式, 当 actor (基本计算单元)接收到消息时, 它将委托责任. 一个 actor 可以创建更多的 actor 并将消息委托给它们.
Akka https://akka.io/ 是实现了 Actor 模型的最著名的工具之一. 该框架支持基于 JVM 的 Java 和 Scala.
使用消息队列实现异步, 非阻塞 I/O:Kafka 和 RabbitMQ
多线程开发在过去一直很流行, 但是这种实践被放弃, 取而代之的是异步, 非阻塞 I/O 模式. 对于 Java, 这在其 Enterprise Java Bean(EJB)规范 中有明确说明:
企业 Bean 不能使用线程同步原语来同步多个实例的执行.
企业 Bean 不能尝试管理线程. 企业 Bean 不能尝试启动, 停止, 挂起或恢复线程, 也不能更改线程的优先级或名称. 企业 Bean 不能试图管理线程组.
现在, 还有其他实践, 如流 API 和 Actor 模型. 但是, Kafka https://kafka.apache.org/ 和 RabbitMQ https://www.rabbitmq.com/ 等消息队列提供了对异步, 非阻塞 IO 特性的开箱即用的支持, 它们是功能强大的开源工具, 可以通过处理并发进程替换线程.
其他选项: Eureka 和 Chaos Monkey
其他有用的容错系统工具包括监控工具, 如 Netflix 的 Eureka https://github.com/Netflix/eureka , 压力测试工具, 如 Chaos Monkey https://github.com/Netflix/chaosmonkey . 它们的目标是通过在较低级的环境 (如集成(INT), 质量保证(QA) 和用户验收测试(UAT)) 中进行测试, 尽早发现潜在的问题, 从而在转移到生产环境之前防止潜在的问题.
你使用什么开源工具来构建容错系统? 请在评论中分享你的最爱.
来源: http://www.tuicool.com/articles/6vyyAry