分布式系统中的自主自治计算 - pathelland


本文是作者pathelland二十年分布式经验分享,其中很多概念与DDD和有界上下文映射非常类似,只不过使用了fiefdom而不是domain来表达。
本文介绍了一个称为fiefdom封地/领地(banq注:类似Domain)的概念 :这是一个自主计算和数据的集合,旨在与不受信任的外部人员合作。这与 拜占庭共识不同, 因为我们并没有真正跨越这些界限达成共识。
另一个相关的计算组件是emissary使者(banq:类似API ),它被设计为领地信任边界的一部分,但它不受信任。它在受信任的领地之外运行。使者通过提供一个靠近不受信任的合作伙伴运行的易于使用的接口,使与领地的合作变得更加简单(banq:上下文之间映射与通讯)。由于使者生成的消息与封地预期的消息匹配,因此传入的工作通常会成功,并且会完成更多的业务。 
通过关联相关消息,跨界工作会随着时间的推移而发生。在使用计算机之前,这是通过具有唯一序列号的纸质表格、表格的多个部分以及随着时间的推移进行的连续修改来完成的。我们将介绍一个称为“协作”的抽象(banq:类似领域事件 中国人的术语称为任务或流水),  来解释它是如何工作的。与封地和使者一样,这是一种具有许多可能实现的模式。
这些模式植根于几个世纪以来帮助公司跨界工作的商业实践。虽然我 20 年前讨论的所有好处仍然适用,但在我们的分布式和复制世界中还有更多方法可以利用这些模式。这篇论文最终是我关于自主计算的许多演讲的散文版。  
 
一、简介
自主计算是指包括独立的计算机系统,异想天开地命名为 “封地”。封地是独立控制和管理的。他们不相信外人。这与身份、身份验证、授权或安全通信无关。这些都是非常重要的主题,但不是本文所要讨论的。这是关于跨信任边界的消息流、这些消息中包含的数据以及如何成功地跨信任边界完成业务。在此设计模式中,包含单个业务操作的相关消息集称为 “协作”。
模式的另一部分在于“ 使者”,另一个异想天开的角色,用于在封地信任边界之外运行的代码,但清楚地了解封地的期望。我们将研究此类不信任系统如何交互、如何处理数据以及如何跨界完成工作。  
如果您不信任您的业务合作伙伴,您就不会与他们分享交易。事务不会跨组织使用,因为如果其他组织搞砸了,这可能会锁定您的数据库!如果没有事务,您必须随时间使用多条消息。但是,为了完成一项长期运行的业务任务而跨越时间,意味着您必须应对结果的不确定性!反过来,这意味着您必须协调工作的结果。   所有这一切都隐含在不信任之中。
20 多年前最初讨论时,封地被认为是一个单一的数据库,由两层应用程序包围和保护。随着时间的推移,我看到了运行在数十万台计算机上提供大规模的封地的例子。自主计算模式与规模大小无关。相反,它侧重于跨多个交互工作以及使用我们称之为协作的抽象将后来的消息与较早的消息相关联的重要性。协作包括业务特定的消息序列、它们如何交互以及如何解决它们。
在本文中,我将介绍 领地、协作 和 使者, 并展示计算和我们日常生活中的例子。我检查了使者如何  在信任边界之外工作并且不受信任,只是方便。本文探讨了跨不同领地的工作如何  启动、长时间运行并最终完成。 
最后,我们重申信任和共享工作基于合作和合作伙伴之间共享的数据。
 
领地、协作和使者
让我们介绍在我称之为Autonomous Computing的常见模式中看到的一些概念 。

Fiefdom领地/封地 是一个英文单词,表示拥有独立领导、规则和控制范围的庄园。从历史上看,这包括公国、男爵领或其他独立的法律领域。每个封地都有自己的习俗、法律和做事方式。它在很大程度上独立于其他地方。
一个 使者 是有代表性的。作为外交代表执行特别任务的人。与大使不同,使者没有权威。他们只能玩得很好,舔狗并试图缓和关系。
随着时间的推移,协作支持消息传递。就像在计算机之前赋予业务权力的纸质表格一样,当他们来回发送消息时,协作会被使者和领地修改。除了将相关消息联系在一起之外,它们还提供了一种将领地或使者内的工作与支持合作业务工作的长期运行的内部状态联系起来的方法。
 
领地和自主计算
在封地中完成工作的唯一方法是发送消息。每个领地都有它接受的消息和合作伙伴发送工作的具体要求。

当我去银行的 ATM 机提取现金时,它只允许我做几件事。我可以提取现金、存入支票、转账和查看我的余额。所有试图通过 JDBC 连接到银行后端数据库的尝试都失败了!就好像我的银行不信任我一样!当一方不信任另一方时,我们如何合作?当双方都不信任对方时怎么办?
这就是在领地工作的感觉。一个领地可以是计算软件和硬件,也可以是一群试图在没有计算机的情况下一起做生意的人。  

  • 向领地请求服务

领地定义了自己的工作规则。如果您想要现金,请输入您的 ATM 卡和您的 PIN 码。如果您想在我的大型商店的货架上销售您的产品,请向我发送以下描述产品的电子消息并请求我的许可。通常,交互的形状和描述由领地定义。
有时,多个领地协同工作。总的来说,关系中经济影响最大的封地定义了要使用的协议和消息。
  • 领地内的私人数据

封地内封装的是私有数据。这是内部的,很少与外部人员共享。我的银行知道我的账户和他们的余额。关于您的帐户的信息不是我的。哎呀,除了必要之外,它并没有告诉我关于我的银行账户的信息。
封装在封地内的私有数据可能有多种形式。它包含了封地最宝贵的思想和商业知识。它是内部的,应该保持内部。
  • 交易和领地

跨界交易意味着跨界信任。经典数据库事务需要协调,并且可能会锁定等待事务结果的数据记录。作为一个不信任的领地,我不会锁定等待你的数据库记录!  
没有信任,我们就没有分布式事务。每个领地都在其腹部使用数据库事务。它不可能与敲敲城堡大门的某个不法之徒的商业伙伴共享交易。 
领地 是一种设计模式,用于跨边界跨信任的长期交互 。随着时间的推移,工作与一系列相关消息一起发生,以执行协作工作。几个世纪以前是这样,今天也是这样。
 
长时间工作的协作
一个 协作 是一组消息的流入和流出单个长时间运行的业务操作的封地的抽象。这不是一个新的想法。  
1960 年代我还是个孩子的时候,我们的日常生活中还没有电脑。当然,大公司将它们放在密室中,而政府和军队则拥有大型主机。我们每天都没有与电脑互动。相反,我们有纸。在购物、去医生办公室或修理东西时,您填写控制活动的表格。我清楚地记得完成某件事所需的多部分和多颜色的表格。  
这些表格中的每一个都预先印有右上角的序列号。当我的父母填写完 Part-1 时,彩色表格的封底被撕掉并交还给他们。其余的页面保存在商店或维修店供内部使用。不同的页面(具有独特的颜色)保存在部门内,因此每个参与者都有一个记录。这些表格将业务内部部门的工作联系在一起,并将其与客户联系起来。
后页的第二个是前台。它被撕下并按序列号归档到文件柜中,表格的其余部分进入发件箱,路由到企业内部部门。他们做了一些工作,填写了第 2 部分,撕下了表格的封底,然后将表格寄出。前台的文件夹是按照表格的编号来组织的。当工作完成并且我的父母拿起购买的、干洗的或修理过的物品时,纸质表格按其序列号归档到“完成作品”文件柜中。
每个多部分的表格形式都是一个“ 协作”:它捕获请求,跟踪正在进行的工作,并确保在纸质表单退回到“已完成的工作”文件夹之前完成所有工作。
 
使者:帮助与领地的互动
我记得 1979 年买了我的第一个家,一个很小的破房子,对于一个六口之家来说太小了。为了获得抵押贷款,我们去找了抵押贷款经纪人。他们得到报酬是为了友善并让借款人更容易。
该抵押贷款经纪人未受雇于任何银行。通常,他们会帮助您从众多银行之一获得贷款。他们有关于各种银行的信息,包括利率表、所需的资格,以及许多对于 23 岁的首次购房者来说几乎无法理解的东西。
选择银行后,我们使用抵押贷款经纪人办公桌中缓存的参考数据填写了大量表格。当这些东西被提交给银行时,他们 并不 信任它。银行下令进行信用评级和就业核查。表格中的所有内容都由不信任的银行检查。银行发现这很方便,因为抵押贷款经纪人知道如何正确填写表格,从而使银行的工作更轻松。
抵押贷款经纪人是现实生活中的 使者。他们不受银行信任,但做了很多有用的工作。与某些使者不同,抵押贷款经纪人可以成为许多不同银行的前端。
在计算系统中,我们看到了使者设计模式的许多用途 。在大型电子商务网站上购物是使用使者作为前端完成的。在这种情况下,使用数千或数万台服务器来实现使者,这些服务器支持购物车、产品目录、产品图像、推荐、评论等等。购物者按下“提交”之前的一切都是使者模式。推送提交后,请求将发送到后端系统进行付款处理、库存检查、发货安排等。 
复杂的分布式后端处理实现了电子商务领域。事实上,大型电子商务后端可能会有许多内部领地。
使者可能有参考数据,使者可能具有重要的 每个用户状态,可以 捕获您作为借款人的能力、包含建议购买的购物车或您在手机上查看已下载电子邮件的视图。
使者Emissaries 是一种设计模式,可以更轻松地与封地合作。他们不受信任,在他们所代表的领地之外执行,并专门简化与领地的多消息协作。
该模式的关键来自于如何在使者和它旨在支持的领地之间的多消息协作中使用数据。
 
跨信任边界重新思考数据
在每种情况下,领地之外的数据都使用标识符将它们编织在一起:
  • 协作 的消息与标识符(例如,订单 ID)相关联。 
  • 参考数据 可能包含由一个或多个标识符关联的产品、价格和选项。电子邮件是使用内部唯一的消息 ID 编织在一起的。在大多数情况下,这是随着时间的推移进行版本控制的。
  • 单个用户数据 可以将正在进行的业务工作与主动协作和参考数据相关联。购物车是单用户数据。

在领地内部,标识符将协作和正在进行的工作与内部状态联系起来。
在领地内部和外部,这些标识符可以保存在关系数据库中,也可以保存在其他一些持久存储中。它们必须经久耐用,以确保它们为与相关协作的下一次交互做好准备。
 
领地内工作
工作在领地内被分解为几个不同的角色。  
  • 活动(事件) 是数据和计算,用于跟踪领地的单个协作工作或单个协作的部分工作。
  • 资源 是用于管理跨多个活动协调的共享事物的代码和数据,例如库存中的小部件或装运所需的卡车上的空间。  

这些模式支持外部协作,并且经常使用许多内部协作组合而成。  
当传入的协作进入一个领地时,会分配一个内部数据结构来跟踪协作的消息、由这些消息激发的工作以及工作的完成情况。这些 活动数据结构 由领地特定活动代码封装 。
推进这项活动的工作受到以下任何一项的刺激:
  •  到达外部协作的外部消息。
  •  用于推动公司内部工作的有关内部协作的内部消息。
  •  将活动推进到新状态并可能采取新行动的计时器。

领地创建机制来管理其活动的工作流程。有很多方法可以使这种模式起作用。在这里,我们专注于模式及其含义。
活动不会永远存在。  它们的生命周期由与协作伙伴成功完成业务所需的工作流驱动。它们是为响应协作消息而创建的,存在一段时间(可能是几秒、几小时或几个月),退出为只读状态,存档并最终在几年后删除。
使用 诸如库存、卡车运输、预订单次航班的乘客、预订特定夜晚的特大号无烟房、每位客户一个月的可计费美元等资源来管理有形事物 。所有这些都是资源(banq:实体)的例子。
通常,资源及其周围的 资源管理者 必须处理不确定性。可以为客户分配资源,但需要在发货前付款。如果进站卡车延误,卡车上的预定空间将被闲置。发货的资源经理可以在发货卡车上放置一个等待箱,但前提是控制等待箱的活动确认了更改。
资源经理处理时间、传入资源、传出资源、超额供应(以确保客户满意)或超额预订(以管理费用)。他们在许多竞争活动中应对不断变化的世界。有时,由于另一项活动的要求,他们无法履行一项活动的义务。  
每个资源管理器内部都有一些小活动。这些跟踪单个分配的资源(或待处理的资源)并关联回与外部协作相关的更大规模的活动。反过来,这些又会影响为其他活动分配宝贵的资源。
许多合作及其信息将这些许多活动和资源联系起来。这可以提供一种统一的方式来唤醒活动、资源和协作,以响应传入的事件或计时器。 
 
结论:信任、协作和数据
自主计算是一种商业工作模式,使用协作来连接领地及其使者。  
这种模式已经基于纸张形式使用了几个世纪。  
我们如何让人们在使用计算机解决业务问题时更容易遵循这种模式?我们应该帮助他们更多地专注于他们的业务,而不是把东西放在一起!