站点可靠性工程(SRE)实战
上QQ阅读APP看书,第一时间看更新

通过服务网格可以实现可靠的系统。这是产生可靠系统的另一种方法。响应式系统是基于广为流传的响应式声明的一个新概念。用于构建可行的响应式系统的响应式编程模型和技术当前有多种。

如前所述,任何软件系统都包含多个模块。此外,多个组件和应用程序需要可靠地相互交互以完成某些复杂的业务功能。在响应式系统中,各个系统都是智能的。然而,关键的区别是各个系统之间的相互作用。也就是说,响应式系统单独运行但协同行动以实现预期结果的能力明显有别于其他系统。响应式系统架构允许多个单独的应用程序共存与合并,并对其周围环境做出自适应的响应。这意味着它们可以根据用户和数据负载、负载均衡进行扩展或缩小,并智能地执行操作,以实现其敏感性和迅速响应。

我们可以使用经过验证的响应式编程模型、模式和平台以响应式方式编写应用程序。但是,为了快速合作以满足不断变化的业务需求,还需要更多的工作。简而言之,实现响应式系统并不容易。响应式系统通常根据广受欢迎的响应式声明文件进行设计和建造。该声明文件明确规定并促进了响应性、可恢复、易伸缩和消息驱动的体系结构的建设。微服务和基于消息的服务交互越来越成为具有灵活、可恢复、易伸缩和松耦合等特征的系统广泛使用的标准。毫无疑问,这些特征是响应式系统的核心概念。

响应式编程是异步编程的一个子集。这是一种新兴的范式,新信息(事件和消息)的可用性推动了处理逻辑的发展。传统上,一些操作是通过基于控制和数据流的执行线程来激活和完成的。

响应式编程独特的编程风格在本质上支持将问题分解为多个不连续的步骤,并且每个步骤都可以以异步和非阻塞的方式执行。然后,可以组合这些步骤以产生一个复合工作流,且该工作流的输入和输出可能是无限的。异步处理意味着在将来某个时间对传入的消息或事件进行处理。事件创建者和消息发送者无须等待处理和执行完成,即可继续履行其职责。这通常被称为非阻塞执行。执行的线程不需要竞争共享资源即可立即完成任务。如果资源不能立即可用,则线程不需要等待不可用资源,而是使用其各自的资源继续处理其他任务。关键是它们可以在特定时间点等待特定任务的适当资源时,不间断地完成工作。换句话说,在当前工作完成之前,它们不会阻止执行线程执行其他工作。它们可以在资源被占用时执行其他有用的工作。

将来,软件应用程序必须具有敏感性和响应性。因此,未来派和以人为中心的应用程序必须能够接收要自适应的事件。事件捕获、存储和处理对于企业、嵌入式和云应用程序变得越来越重要。响应式编程正在成为生成事件驱动的软件应用程序的一个重要概念。事件既有简单的也有复杂的。事件主要是以流的形式连续传输的,因此事件处理功能被称为流式分析。有几种流分析平台,例如Spark Streams、Kafka Streams、Apache Flink、Storm等,它们都可用于从流数据中解析可操作的见解。

在越来越受事件驱动的世界中,EDA和编程模型获得了更多的市场份额和关注。因此,响应式编程是一项宏伟的举措,旨在为具有无阻塞场景的异步流处理提供标准解决方案。响应式编程的主要优点包括提高多核和多处理器硬件上计算资源的利用率。响应式编程有几个事件驱动编程库、中间件解决方案、支持框架和架构,可以每秒捕获、清理和处理数百万个事件。用于促进事件驱动编程的流行库包括Akka Streams、Reactor、RxJava和Vert.x等。

响应式编程与响应式系统:响应式编程和响应式系统之间存在巨大差异。如前所述,响应式编程主要是事件驱动的,而响应式系统是消息驱动的,专注于创建易伸缩和可恢复的软件系统。消息是沟通和协作的主要形式。分布式系统通过发送、接收和处理消息进行协调。消息本质上是定向的,而事件不是。消息有明确的方向和目的地;事件是其他人可以清晰地观察并采取行动的事实。消息传递通常与发送方异步,并且与读是分离的。在消息驱动的系统中,可寻址的收件人等待消息到达;在事件驱动的系统中,消费者与事件来源和事件存储相集成。

在响应式系统中(尤其是使用响应式编程的响应式系统)存在事件和消息。消息是一种很好的交流工具,而事件是明确表示事实的最佳选择。消息应该通过网络传输,并形成分布式系统中通信的基础。消息传递用于跨网络桥接事件驱动的系统。因此,事件驱动编程是分布式计算环境中的简单模型,但分布式计算环境中的消息传递并非如此。消息传递必须做很多事情,因为分布式计算存在一些限制和挑战。也就是说,消息传递必须解决诸如部分失败、故障检测、丢弃/重复/重新排序的消息、最终一致性以及管理多个并发现实等问题。这些语义和适用性的差异对应用程序设计具有强烈的影响,包括易伸缩性、可恢复性、移动性、位置透明性和分布式系统的管理复杂性等。

响应式系统完全符合响应式声明(易伸缩性、响应性、可恢复和消息驱动),响应式声明是由一组IT产品供应商设想和发布的。当前正在制订和确定各种架构设计和原则,以建立最现代化的认知系统,这些系统天生就能够满足当今复杂而精致的要求。对于响应式系统功能来说,消息是最理想的信息交换单元。这些消息在应用程序之间创建了一种时间边界。消息使应用程序组件能够在时间(这允许并发)和空间(这允许分发和移动)上解耦。这种解耦功能有助于各种应用服务之间的隔离。这种解耦最终确保了易伸缩性和可恢复性,这是生产可靠系统最重要的需求。

弹性是指在系统发生故障时的响应能力,并且是系统固有的功能特性。弹性能力要比容错能力更重要,后者指的是应用程序可以进行优雅降级。弹性指的是从任何失败中完全恢复。弹性使系统能够进行自我诊断和自我修复。此属性需要对组件进行隔离和遏制,以避免故障传播到相邻组件。如果允许错误和失败级联到其他组件,整个系统注定会失败。

因此,设计、开发和部署具有弹性、自我修复能力系统的关键是允许主动发现和遏制任何类型的故障,将其编码为消息,并发送到管理程序组件。这些可以从安全级别进行监控、测量和管理。在这里,消息驱动是最大的推动者,从紧耦合系统向转向松散和轻耦合系统是前进的方向。通过较少的依赖性,可以找出受影响的组件,并且可以将错误的传播“扼杀”在萌芽状态。

弹性是指负载下的响应能力。系统可以突然被许多用户使用,或者有成千上万的传感器和设备将大量的数据注入到系统中。为了解决这种用户和数据的意外激增,系统必须通过添加额外资源(裸机服务器、虚拟机和容器)自动扩展或缩小规模。云环境天生就能够根据不同的资源需求进行自动扩展。此功能使系统以优化的方式使用其昂贵的资源。当资源利用率上升时,系统的资本和运营成本将急剧下降。

系统需要具有足够的适应性,以便在无须任何手动干预、指导和解释的情况下,进行自动缩放、状态和行为复制、负载均衡、故障转移和升级。简而言之,通过信息传递设计、开发和部署响应式系统是当务之急。