重新思考分布式系统:事件为何不成功

banq


改变你对系统的看法可能会产生重大影响。以哥白尼为例,一个“简单”的视角变化对我们所有人都有宝贵的教训。

16 世纪初,哥白尼意识到,现有的太阳系模型过于复杂。这些模型看上去很漂亮,但要弄清楚物体相对于其他物体的位置,它就成了一个相当困难的工作模型。

他认为,通过改变参考系,这些模型可以大大简化。与其用地球作为宇宙的中心来建模一切,不如将太阳置于中心,这样就可以创建一个更简单、更容易理解的系统。

这个新模型大大简化了对行星运动的理解,并促成了一系列全新的发现和发展,我们现在称之为“哥白尼革命”。这个简单的视角变化为我们所有人提供了宝贵的教训;改变你对一个系统的看法可能会产生重大影响。

越简单的图越好
事件驱动架构 (EDA) 是使用微服务构建的现代应用程序中最常见的模式之一。就像以地球为中心的模型一样,一些架构图看起来相当漂亮。然而,一旦你被迫大规模使用它们,许多开发人员就会发现它们非常复杂、脆弱且令人沮丧。

哥白尼的洞见:尝试转移中心
如果你将世界观的中心从事件上移开,你或许能够降低软件系统的复杂性。这反过来又可以解锁和解除那些被过于复杂的 EDA 系统所困扰的项目。

事件驱动架构的常见问题
事件驱动架构是构建分布式应用程序的常用方法。然而,EDA 存在重大缺陷,尤其是在扩展时:

  1. 没有 API:实施 EDA 通常会导致失去清晰、定义明确的 API。事件缺乏 API 提供的文档和结构,导致对每个服务使用和生成哪些事件产生歧义。
  2. 紧密耦合:尽管人们认为 EDA 系统耦合程度较低,但实际上 EDA 系统通常耦合程度较高,因为一项服务的变化可能会导致整个系统出现意想不到的后果。事件实际上是全局变量,对这些事件和事件格式的更改可能会破坏整个系统的服务。
  3. 逻辑分散:业务逻辑变得碎片化,分散在许多不同的服务中,这使得理解和维护变得困难。
  4. 可调试性差:如果事件处理程序没有按预期发生,则追踪先前的事件以找出事件链中断的位置会很繁琐,并且需要大量仔细的调查。而且,通常,了解事件链可能包含的内容本身就是一项不小的研究项目。
  5. 不断增加的临时状态机:每个服务都成为临时状态机,使状态管理变得复杂。这种状态分散在不同的系统和事件中,很难清楚地了解正在发生的事情及其原因。
  6. 增加延迟:管理事件流所需的排队和基础设施开销可能会带来相当大的延迟。
  7. 竞争条件:除非您使用发件箱 模式来保证数据一致性,否则队列和数据库之间将会出现竞争条件,这种竞争条件很难诊断和排除故障。
  8. 系统可升级性:由于依赖关系定义不明确、理解不透彻以及状态管理分散,升级 EDA 系统极其困难。

持久执行Durable Execution:替代事件的更好抽象
持久执行Durable Execution为事件驱动架构提供了一种引人注目的替代方案,解决了其许多缺点。

实则是一种状态视角,回到用状态替代事件。

  • Actor模型等是这种有状态视角
  • Temporal 等平台使用Durable Execution方法提供更具弹性且更易于维护的分布式系统。

收集您的业务逻辑并简化您的生活 ,通过持久执行Durable Execution,开发人员使用位于一个中心位置的代码定义业务逻辑,从而显着提高理解和可调试性。

  • 一致地管理状态: 持久执行处理状态管理、重试等,以便网络中断、不稳定的端点、长时间运行的进程和其他瞬态故障不会因管理不可靠进程的复杂性而压垮您的系统。
  • 优雅地应对崩溃: 持久执行本身就支持弹性。即使遇到进程崩溃或系统中断,执行状态也会保留,从而允许应用从中断处恢复。此功能可确保一致性和可靠性,使操作更加可靠和有弹性。
  • 灵活地设计流程: 持久执行可处理长时间运行的复杂流程。这种灵活性支持同步和异步流程,可满足各种应用需求。开发人员可以构建跨越数小时、数天甚至更长时间的系统,而不会牺牲可靠性。

从事件驱动架构转向持久执行不仅仅是一种不同的系统建模方式,更是构建可靠且可维护软件方式的根本性变革。通过解决事件驱动设计的缺点并提供更直观、更有效的框架,持久执行使您能够创建更易于理解、维护和扩展的分布式系统。

当我们寻求建立更好、更可靠的系统时,拥有正确的参考框架可以发挥很大的作用。是的,你可以将整个宇宙建模为围绕地球旋转,但如果你借鉴哥白尼的经验,你可能会发现改变你的参考框架将使你的系统变得容易得多。