分布式应用程序的构建块。 零近似

分布式应用程序的构建块。 零近似

世界并非静止不动。 进步带来了新的技术挑战。 根据不断变化的需求,信息系统的架构必须不断发展。 今天我们将讨论事件驱动架构、并发、并发、异步,以及如何在 Erlang 中与这一切和平共处。

介绍

根据设计系统的规模和要求,我们开发人员选择系统中交换信息的方法。 在大多数情况下,为了组织服务的交互,工作选项可能是带有代理的方案,例如基于RabbitMQ或kafka。 但有时,事件流、SLA 和系统控制级别使得现成的消息传递不适合我们。 当然,您可以通过负责传输层和集群形成来使系统稍微复杂化,例如使用 ZeroMQ 或 nanomsg。 但如果系统具有足够的吞吐量和标准 Erlang 集群的功能,那么引入额外实体的问题需要详细研究和经济合理性。

反应式分布式应用程序的主题非常广泛。 为了保持本文的格式,今天讨论的主题将仅是基于 Erlang/Elixir 构建的同质环境。 Erlang/OTP 生态系统允许您以最少的努力实现反应式架构。 但无论如何,我们都需要一个消息传递层。

理论基础

设计从定义目标和约束开始。 主要目标不是为了发展而发展。 我们需要获得一个安全且可扩展的工具,在此基础上我们可以创建,最重要的是,开发各种级别的现代应用程序:从服务于小受众的单服务器应用程序开始,然后发展为最多 50 个的集群-60 个节点,以集群联合结束。 因此,主要目标是通过降低最终系统的开发和拥有成本来实现利润最大化。

让我们重点介绍最终系统的 4 个主要要求:

  • С面向事件。
    系统始终准备好传递事件流并执行必要的操作;
  • М可扩展性。
    各个块可以垂直和水平缩放。 整个系统必须能够无限水平增长;
  • О容错能力。
    所有级别和所有服务都应该能够从故障中自动恢复;
  • Г保证响应时间。
    时间很宝贵,用户不应等待太久。

还记得关于“小引擎可以”的古老童话故事吗? 为了使设计的系统成功退出原型阶段并不断进步,其基础必须满足最低要求 烟雾.

作为一种基础设施工具和所有服务的基础,消息传递还添加了一点:程序员的易用性。

事件导向

为了使应用程序从单个服务器发展到集群,其架构必须支持松耦合。 异步模型满足了这个要求。 其中,发送者和接收者关心消息的信息负载,而不用担心系统内的传输和路由。

可扩展性

可扩展性和系统效率是紧密相连的。 应用程序组件必须能够利用所有可用资源。 我们越有效地利用产能,我们的加工方法越优化,我们在设备上花费的钱就越少。

在单台机器内,Erlang 创建了一个高度竞争的环境。 并发性和并行性之间的平衡可以通过选择 Erlang VM 可用的操作系统线程数和利用这些线程的调度程序数来设置。
Erlang 进程不共享状态并以非阻塞模式运行。 与传统的基于阻塞的应用程序相比,这提供了相对较低的延迟和更高的吞吐量。 Erlang 的调度程序确保 CPU 和 IO 的公平分配,并且无阻塞允许应用程序即使在峰值负载或故障期间也能做出响应。

在集群层面,也存在处置问题。 重要的是集群中的所有机器负载均匀并且网络不过载。 让我们想象一种情况:用户流量到达传入平衡器(haproxy、nginx 等),它们在可用后端集之间尽可能均匀地分配处理请求。 在应用程序基础设施中,实现所需接口的服务只是最后一英里,需要请求许多其他服务来响应初始请求。 内部请求也需要路由和平衡。
为了有效地管理数据流,消息传递必须为开发人员提供一个接口来管理路由和负载平衡。 因此,开发人员将能够使用微服务模式(聚合器、代理、链、分支等)来解决标准问题和很少出现的问题。

从业务角度来看,可扩展性是风险管理工具之一。 主要是通过优化使用设备来满足客户的要求:

  • 当装备的威力因进步而增加时。 不会因为软件不完善而闲置。 Erlang 垂直扩展良好,并且始终能够利用所有 CPU 核心和可用内存;
  • 在云环境中,我们可以根据当前或预测的负载来管理设备数量并保证SLA。

容错

让我们考虑两个公理:“失败是不可接受的”和“总会有失败”。 对于企业来说,软件故障意味着金钱损失,更糟糕的是声誉损失。 在可能的损失和开发容错软件的成本之间进行权衡,通常可以找到折衷方案。

从短期来看,包含容错功能的架构可以节省购买现成集群解决方案的资金。 它们价格昂贵,而且也有缺陷。
从长远来看,容错架构在开发的各个阶段都会带来数倍的回报。
代码库内的消息传递允许您在开发阶段详细计算系统内组件的交互。 这简化了响应和管理故障的任务,因为所有关键组件都会处理故障,并且最终的系统通过设计知道如何在发生故障后自动恢复正常。

反应能力

无论发生什么故障,应用程序都必须响应请求并满足 SLA。 现实情况是,人们不想等待,因此企业必须做出相应的调整。 越来越多的应用程序预计将具有高响应能力。
响应式应用程序几乎实时运行。 Erlang VM 以软实时模式运行。 对于某些领域,例如股票交易、医药和工业设备控制,硬实时模式很重要。
响应式系统可改善用户体验并使业务受益。

初步结果

在计划这篇文章时,我想分享我创建消息代理并基于它构建复杂系统的经验。 但理论和动机部分却相当广泛。
在本文的第二部分中,我将讨论实现交换点、消息传递模式及其应用的细微差别。
在第三部分中,我们将考虑组织服务、路由和平衡的一般问题。 让我们谈谈系统的可扩展性和容错性的实际方面。

第一部分结束。

照片 @卢卡布拉沃.

来源: habr.com

添加评论