在我们以往的工作中经常会遇到“原子服务”或“原子化服务”的概念,如果没有一个清晰的概念边界,会使大家的沟通和讨论无法在同一个共识上展开,大家不在同一频道上,割裂于不同的领域空间,难以产生一致性的进展。那么,原子服务到底是什么呢?
1. 原子服务的辨析
原子服务一词由“原子”和“服务”两个单元组成,那么语义的重心是原子还是服务呢?个人认为是服务。然而服务的概念范围仍然很大, 外卖小哥送货是一种服务,理发也是一种服务,而我们定位在软件领域,即讨论的是基于软件提供的服务。
1.1 原子与服务
在《组件化与服务化的辨析》一文中,服务被定义为: “任何一方可以提供给另一方的本质上是无形的,并且不会导致任何所有权的行为或表现。它的生产可能与实物产品有关,也可能与实物产品无关。”在软件中,这被称为“松耦合”。软件服务是一个粗粒度的、可发现的实体,它作为单个实例存在,并与应用程序和其他服务交互。服务的概念不同于组件的概念,因为服务不定义任何结构约束,而是定义接口。
原子则是物理学的概念,在中学的物理课上,我们知道原子是由原子核与核外电子组成。原子和服务分属于两个不同的领域,那么,原子服务联合起来仅仅是一种隐喻还是真实地表达为一种客观而独特的软件实体呢?产生歧义的根源或许在于二者兼而有之。
1.2 原子服务的潜在含义
个人认为, 原子服务与微服务的概念类似,都是表达软件服务颗粒度以及如何实现该颗粒度服务的方式。在微服务中,往往强调的是服务的职责尽量单一。业务系统中业务的功能特性集合没有改变,只是组成方式通过小颗粒度的服务编排而成,通过组成方式的变化来满足更多的非功能性需求,例如可伸缩性,弹性等。而原子服务则强调的是不可拆分性,从约束的视角来描述服务。
也就是说, 原子服务可能有两层含义:颗粒度不可拆分和如何利用这样的颗粒度服务满足更多需求。前者是从空间维度的理解,后者是一个过程和结果,可以从时间维度来理解。而且,后者一般用“原子化服务“来表达过程以及服务原子化后带来的效果,与微服务化类似。但是,由于中文的博大精深,人们用往往用“原子服务”来统一这两种含义,从而严重依赖上下文语境来判断“原子服务”所指的到底是哪一种含义。
1.3 原子服务与原子操作
原子服务是关于服务最小化颗粒度的描述。然而,颗粒度是一个相对概念,只能在特定的场景中精确定义。例如,如果一个服务实现了银行系统的所有功能,那么它可以被认为是粗粒度的。如果它只支持信贷余额检查,那么它就被认为是细粒度的。
通过与编程语言中原子操作进行类比,或许可以进一步了解原子服务的颗粒度判定。
原子操作(atomic operation)意味为”不可被中断的一个或一系列操作” ,对于我们来说,是相对熟悉的概念。从用户角度,可以用原子操作来替换重量级的锁同步,从而提高程序性能。从底层实现的角度,原子操作可以用于构建各种更重量级的同步操作,比如锁或屏障之类的。就底层实现而言,对于单处理器单核系统来说,只要保证操作指令序列不被打断即可实现原子操作,一般需要自旋锁spinlock来保证操作指令序列不会在执行的中途受干扰。对于多处理器或者多核的系统,原子操作的实现除了需要spinlock来保证外,还需要保证不会受到同处理器上其他核,或者其他处理器的影响。
类比到原子服务,原子服务的不可分割性实际上强调的是服务的事务一致性,也就是一个服务的自身完整性。服务应该在与现实世界活动或可识别的业务功能相对应的抽象级别上,因此在服务及其方法的适当粒度级别相对较粗。原子服务通常支持单个独特的业务概念或流程,包含了现业务概念的软件,因此可以在类似的上下文中重用它。
2. 原子服务在软件系统中的不同含义
由于原子服务自身具有隐喻色彩,即便在软件领域以及不同的软件系统间同样存在着不同的含义。
2.1 web service 中的原子服务
在Web service 领域,服务被分为两种形态:
原子服务(atomic services):即不可再分解为更细粒度的服务 *合成服务(composite services):即通过多个原子服务组合而成的服务
合成服务与其它Web服务类似,都有WSDL服务契约,并且都是通过SOAP消息调用的。合成服务的创建一般也有两种方式:
通过直接编程的方式来创建合成服务,例如把一个EJB发布为一个用到其他Web服务的Web服务。
通过使用Web服务编排(Web service orchestration)及WS-BPEL来创建合成服务。
对于后者,开发者一般使用Web服务编排产品来定义合成服务,以及一个执行WS-BPEL流程定义的 runtime engine(如AcitveBPEL)。
2.2 微服务中的原子服务
在微服务相关的软件架构体系中,在业务上最小粒度的一系列操作,可以被抽象为一个原子服务。例如,用户下单这个组合服务,可以被拆分为——
用户扣款(用户账户微服务)
扣除库存(商家微服务)
生成订单(订单中心微服务)等待
类比原子操作,既然原子操作就是要么全成功要么全失败的最小粒度操作,那么每个微服中的原子服务可以只关心自己的这点事,其他服务如何实现,内部如何failover,都不用关心。
2.3 SDV 中的原子服务
在SDV(软件定义汽车)中,电气架构从原来的分布式架构变为了中央域+区域控制器架构,主机厂把服务划分为原子服务,组合服务,应用服务。其中,原子服务是对于作为服务的最小单位和单一执行实体(如传感器、执行器)进行抽象,通过API向上提供单一功能的服务接口,可重复调用,原子服务的划分最基本原则就是不能再继续向下分解。
关于SDV中传感器原子服务的一般设计方法如下:
针对无ECU传感器(电压传感器、电流传感器、压力传感器、高度传感器等),根据底层软件电平信号转化为物理信号并提供API(如电压/电流等);
针对有ECU传感器(SAS传感器、ESC控制器),根据底层服务提供的解析,转化为物理信号提供API(如车速、转角);
针对传感器本身的健康状态信息定义成一个Event类型,包含各种故障状态。、、
关于SDV执行器的原子服务设计方法:
针对无ECU执行器对外API接口为底软IO控制指令;
针对有ECU执行器对外API接口为总线控制输入信号;
每一个执行器的服务可以定义成一个抽象服务,服务的类型定义成一个Field类型;
针对执行器的执行状态定义成 Event 类型,其状态反馈以及故障状态。
2.4 鸿蒙系统中的原子服务
在鸿蒙系统中,所谓的“原子服务”被强调为“原子化服务”,其前身的元服务。元服务的关键特征是可分,可合以及可流转。
鸿蒙从开发者和用户两个视角来描述原子化服务的行为效果。
对开发者而言,原子化服务只需开发一次,便可在各种HarmonyOS终端上,降低了开发成本。原子化服务基于HarmonyOS API开发,支持运行在1+8+N设备上。原子化服务由1个或多个HAP包组成,1个HAP包对应1个FA或1个PA。每个FA或PA均可独立运行,完成1个特定功能;1个或多个功能(对应FA或PA)完成1个特定的便捷服务。
对用户而言,原子化服务是HarmonyOS 提供的一种面向未来的服务提供方式。原子化服务有独立入口的(用户可通过点击、碰一碰、扫一扫等方式直接触发),并且是免安装的(无需显式安装,由系统程序框架后台安装后即可使用),可为用户提供一个或多个便捷服务的用户程序形态。
基于鸿蒙系统的设备,华为明确定义了原子化服务的触发方式。
2.5 原子服务的相关标准
鉴于原子服务的概念范围不明确,业界并没有对原子服务达成统一的共识,目前还处于在各自领域的独自演进阶段,业界也没有形成关于原子服务的相关标准。
但是,在各领域中,原子服务概念存在着相互借鉴的趋势,软件绿色联盟曾发布过一个原子化服务的技术标准。在该标准中,原子化服务聚集于元能力,英文名称Atomic Ability,是一个可以独立执行,实现单一功能的程序实体,它的承载实体类型可以是一个小程序/快应用/Native 服务。其定义的原子化服务具有如下特点:
可以以最小集启动,尽可能较少资源消耗;
不同应用间的AA通过系统打通,更匹配用户的场景需要;
通过分发平台提供的丰富入口,使得服务提供更加多元、智能。
在软件绿色联盟的原子化服务技术标准中,原子化服务被分为如下两类:
基于Web的原子化服务 :小程序、快应用、HTML5应用
基于Native 的原子化服务:是一种基于本地(操作系统)并使用原生程式编写运行的本地原子化服务。一般使用的开发语言为JAVA、C++、Objective-C。
3. 设计领域的原子服务
在设计领域, 原子化服务的设计也代表着不同的设计理念。最早,原子设计理论是网页设计师Brad Frost从化学元素周期表中得到启发,所有的界面均是由一些基本的元素构成,扩展到页面维度即小页面组成大页面。
原子设计理论被定义为:一种由五个不同阶段组成的方法,它们协同工作,以更加审慎和分层的方式创建更有效的界面设计系统。五个不同阶段概括为:原子、分子、组织、模版和页面,如下表所示——
这种“打散重组式”的界面设计思路被广泛应用于终端界面设计,实现了移动端的响应式设计。在所有这些界面设计中,当底层模板相同,用户界面通常需要发生变化以反映内容的动态特性。这些变化直接影响基础分子,组织和模板的构建方式,有助于创建更具弹性的设计系统。
服务设计可以运用设计思维在服务基础上的整合资源。设计思维只是应用在服务设计中的一种方法论,当原子设计理论从线上(界面设计领域)转移至线上与线下(服务设计领域),服务将会出现新的变化。“体验元”和“体验级”将以自身的属性随之变化。
原子设计理论在服务设计中的优势体现为系统化搭建、标准化创新和模块化迭代。
4. 一句话小结
鉴于老码农的认知局限和有限的理解,认为原子服务是一个严重依赖上下文语境的抽象概念,在涉及原子服务的设计、架构和工程实现的时候,需要先明确原子服务的概念空间,进而确定应用的领域,或许才能体现出原子服务的价值。
【关联阅读】
Agent 与对象的辨析
组件化与服务化的辨析
老码农眼中的SBOM
机器学习与微分方程的浅析
算法与模型的浅析
浅析面向云架构的SLA
网络流量的经济学浅析
为什么不重构呢?
对于NPS 的学习和认知
复杂性,科学,方法论?
不了解持续架构会落伍么?
关于软件开发,都应该知道的10个常识
没有被了解的API?一个老码农眼中的API世界