关于原子服务的思考

news2024/10/2 6:35:59

在我们以往的工作中经常会遇到“原子服务”或“原子化服务”的概念,如果没有一个清晰的概念边界,会使大家的沟通和讨论无法在同一个共识上展开,大家不在同一频道上,割裂于不同的领域空间,难以产生一致性的进展。那么,原子服务到底是什么呢?

c376cc812f2156998c70e3946f83c048.jpeg

1. 原子服务的辨析

原子服务一词由“原子”和“服务”两个单元组成,那么语义的重心是原子还是服务呢?个人认为是服务。然而服务的概念范围仍然很大, 外卖小哥送货是一种服务,理发也是一种服务,而我们定位在软件领域,即讨论的是基于软件提供的服务。

1.1 原子与服务

在《组件化与服务化的辨析》一文中,服务被定义为: “任何一方可以提供给另一方的本质上是无形的,并且不会导致任何所有权的行为或表现。它的生产可能与实物产品有关,也可能与实物产品无关。”在软件中,这被称为“松耦合”。软件服务是一个粗粒度的、可发现的实体,它作为单个实例存在,并与应用程序和其他服务交互。服务的概念不同于组件的概念,因为服务不定义任何结构约束,而是定义接口。

原子则是物理学的概念,在中学的物理课上,我们知道原子是由原子核与核外电子组成。原子和服务分属于两个不同的领域,那么,原子服务联合起来仅仅是一种隐喻还是真实地表达为一种客观而独特的软件实体呢?产生歧义的根源或许在于二者兼而有之。

1.2 原子服务的潜在含义

个人认为, 原子服务与微服务的概念类似,都是表达软件服务颗粒度以及如何实现该颗粒度服务的方式。在微服务中,往往强调的是服务的职责尽量单一。业务系统中业务的功能特性集合没有改变,只是组成方式通过小颗粒度的服务编排而成,通过组成方式的变化来满足更多的非功能性需求,例如可伸缩性,弹性等。而原子服务则强调的是不可拆分性,从约束的视角来描述服务。

也就是说, 原子服务可能有两层含义:颗粒度不可拆分和如何利用这样的颗粒度服务满足更多需求。前者是从空间维度的理解,后者是一个过程和结果,可以从时间维度来理解。而且,后者一般用“原子化服务“来表达过程以及服务原子化后带来的效果,与微服务化类似。但是,由于中文的博大精深,人们用往往用“原子服务”来统一这两种含义,从而严重依赖上下文语境来判断“原子服务”所指的到底是哪一种含义。

97888facc3724b184789d709af3092d7.jpeg

1.3 原子服务与原子操作

原子服务是关于服务最小化颗粒度的描述。然而,颗粒度是一个相对概念,只能在特定的场景中精确定义。例如,如果一个服务实现了银行系统的所有功能,那么它可以被认为是粗粒度的。如果它只支持信贷余额检查,那么它就被认为是细粒度的。

通过与编程语言中原子操作进行类比,或许可以进一步了解原子服务的颗粒度判定。

原子操作(atomic operation)意味为”不可被中断的一个或一系列操作” ,对于我们来说,是相对熟悉的概念。从用户角度,可以用原子操作来替换重量级的锁同步,从而提高程序性能。从底层实现的角度,原子操作可以用于构建各种更重量级的同步操作,比如锁或屏障之类的。就底层实现而言,对于单处理器单核系统来说,只要保证操作指令序列不被打断即可实现原子操作,一般需要自旋锁spinlock来保证操作指令序列不会在执行的中途受干扰。对于多处理器或者多核的系统,原子操作的实现除了需要spinlock来保证外,还需要保证不会受到同处理器上其他核,或者其他处理器的影响。

类比到原子服务,原子服务的不可分割性实际上强调的是服务的事务一致性,也就是一个服务的自身完整性。服务应该在与现实世界活动或可识别的业务功能相对应的抽象级别上,因此在服务及其方法的适当粒度级别相对较粗。原子服务通常支持单个独特的业务概念或流程,包含了现业务概念的软件,因此可以在类似的上下文中重用它。

2. 原子服务在软件系统中的不同含义

由于原子服务自身具有隐喻色彩,即便在软件领域以及不同的软件系统间同样存在着不同的含义。

2.1 web service 中的原子服务

在Web service 领域,服务被分为两种形态: 

  • 原子服务(atomic services):即不可再分解为更细粒度的服务 *合成服务(composite services):即通过多个原子服务组合而成的服务

合成服务与其它Web服务类似,都有WSDL服务契约,并且都是通过SOAP消息调用的。合成服务的创建一般也有两种方式:

  1. 通过直接编程的方式来创建合成服务,例如把一个EJB发布为一个用到其他Web服务的Web服务。

  2. 通过使用Web服务编排(Web service orchestration)及WS-BPEL来创建合成服务。

对于后者,开发者一般使用Web服务编排产品来定义合成服务,以及一个执行WS-BPEL流程定义的 runtime engine(如AcitveBPEL)。

76e031ea7c4623fa2207453a56dda6d1.jpeg

2.2 微服务中的原子服务

在微服务相关的软件架构体系中,在业务上最小粒度的一系列操作,可以被抽象为一个原子服务。例如,用户下单这个组合服务,可以被拆分为——

  1. 用户扣款(用户账户微服务)

  2. 扣除库存(商家微服务)

  3. 生成订单(订单中心微服务)等待

类比原子操作,既然原子操作就是要么全成功要么全失败的最小粒度操作,那么每个微服中的原子服务可以只关心自己的这点事,其他服务如何实现,内部如何failover,都不用关心。

2.3 SDV 中的原子服务

在SDV(软件定义汽车)中,电气架构从原来的分布式架构变为了中央域+区域控制器架构,主机厂把服务划分为原子服务,组合服务,应用服务。其中,原子服务是对于作为服务的最小单位和单一执行实体(如传感器、执行器)进行抽象,通过API向上提供单一功能的服务接口,可重复调用,原子服务的划分最基本原则就是不能再继续向下分解。

a1f6fd1201f920c57953edfaaffc1902.png

关于SDV中传感器原子服务的一般设计方法如下:

  1. 针对无ECU传感器(电压传感器、电流传感器、压力传感器、高度传感器等),根据底层软件电平信号转化为物理信号并提供API(如电压/电流等);

  2. 针对有ECU传感器(SAS传感器、ESC控制器),根据底层服务提供的解析,转化为物理信号提供API(如车速、转角);

  3. 针对传感器本身的健康状态信息定义成一个Event类型,包含各种故障状态。、、

关于SDV执行器的原子服务设计方法:

  1. 针对无ECU执行器对外API接口为底软IO控制指令;

  2. 针对有ECU执行器对外API接口为总线控制输入信号;

  3. 每一个执行器的服务可以定义成一个抽象服务,服务的类型定义成一个Field类型;

  4. 针对执行器的执行状态定义成 Event 类型,其状态反馈以及故障状态。

2.4 鸿蒙系统中的原子服务

在鸿蒙系统中,所谓的“原子服务”被强调为“原子化服务”,其前身的元服务。元服务的关键特征是可分,可合以及可流转。

79458b252a3bb5c744e7265232d355f8.png

鸿蒙从开发者和用户两个视角来描述原子化服务的行为效果。

对开发者而言,原子化服务只需开发一次,便可在各种HarmonyOS终端上,降低了开发成本。原子化服务基于HarmonyOS API开发,支持运行在1+8+N设备上。原子化服务由1个或多个HAP包组成,1个HAP包对应1个FA或1个PA。每个FA或PA均可独立运行,完成1个特定功能;1个或多个功能(对应FA或PA)完成1个特定的便捷服务。

d1692d8ab5e353259764465718c3d6cf.png

对用户而言,原子化服务是HarmonyOS 提供的一种面向未来的服务提供方式。原子化服务有独立入口的(用户可通过点击、碰一碰、扫一扫等方式直接触发),并且是免安装的(无需显式安装,由系统程序框架后台安装后即可使用),可为用户提供一个或多个便捷服务的用户程序形态。

基于鸿蒙系统的设备,华为明确定义了原子化服务的触发方式。

e748541d9a4971587f95d178c5fe5d5e.png

2.5 原子服务的相关标准

鉴于原子服务的概念范围不明确,业界并没有对原子服务达成统一的共识,目前还处于在各自领域的独自演进阶段,业界也没有形成关于原子服务的相关标准。

但是,在各领域中,原子服务概念存在着相互借鉴的趋势,软件绿色联盟曾发布过一个原子化服务的技术标准。在该标准中,原子化服务聚集于元能力,英文名称Atomic Ability,是一个可以独立执行,实现单一功能的程序实体,它的承载实体类型可以是一个小程序/快应用/Native 服务。其定义的原子化服务具有如下特点:

  • 可以以最小集启动,尽可能较少资源消耗;

  • 不同应用间的AA通过系统打通,更匹配用户的场景需要;

  • 通过分发平台提供的丰富入口,使得服务提供更加多元、智能。

在软件绿色联盟的原子化服务技术标准中,原子化服务被分为如下两类:

  • 基于Web的原子化服务 :小程序、快应用、HTML5应用

  • 基于Native 的原子化服务:是一种基于本地(操作系统)并使用原生程式编写运行的本地原子化服务。一般使用的开发语言为JAVA、C++、Objective-C。

564c0cf212ca283cc6fe6174b36d6011.png

3. 设计领域的原子服务

在设计领域, 原子化服务的设计也代表着不同的设计理念。最早,原子设计理论是网页设计师Brad Frost从化学元素周期表中得到启发,所有的界面均是由一些基本的元素构成,扩展到页面维度即小页面组成大页面。

原子设计理论被定义为:一种由五个不同阶段组成的方法,它们协同工作,以更加审慎和分层的方式创建更有效的界面设计系统。五个不同阶段概括为:原子、分子、组织、模版和页面,如下表所示——

1bda0675f8c188b83ba5bea302f56daf.png

这种“打散重组式”的界面设计思路被广泛应用于终端界面设计,实现了移动端的响应式设计。在所有这些界面设计中,当底层模板相同,用户界面通常需要发生变化以反映内容的动态特性。这些变化直接影响基础分子,组织和模板的构建方式,有助于创建更具弹性的设计系统。

服务设计可以运用设计思维在服务基础上的整合资源。设计思维只是应用在服务设计中的一种方法论,当原子设计理论从线上(界面设计领域)转移至线上与线下(服务设计领域),服务将会出现新的变化。“体验元”和“体验级”将以自身的属性随之变化。

5bdbde723befa79f67f137e2a8a8c9e1.png

原子设计理论在服务设计中的优势体现为系统化搭建、标准化创新和模块化迭代。

4. 一句话小结

鉴于老码农的认知局限和有限的理解,认为原子服务是一个严重依赖上下文语境的抽象概念,在涉及原子服务的设计、架构和工程实现的时候,需要先明确原子服务的概念空间,进而确定应用的领域,或许才能体现出原子服务的价值。

【关联阅读】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAR ADC系列26:系统设计

目录 串一下知识点: 设计一个高速异步SAR ADC 设计目标: 电路架构:(具体电路看前文) 采样网络: 采样电容: CDAC开关切换策略: CDAC阵列冗余设计: SAR 逻辑 比…

谈谈内存模型happen-before讲的什么?

大家好我是易安! 今天我要讲述的是Java内存模型中的happen-before。 Java语言在设计之初就引入了线程的概念,以充分利用现代处理器的计算能力。多线程机制既带来了强大、灵活的优势,也带来了线程安全等令人混淆的问题。在这种情况下&#xff…

二叉查找树

目录 一、二叉查找树概念 二、结点内部类代码实现: 三、二叉查找树的插入原理​编辑 四、遍历的方式(中序遍历): 五、二叉查找树实现指定值删除对应的结点 六、main方法测试 一、二叉查找树概念 二、结点内部类代码实现&…

聚类问题的算法总结

目录 一、K-means算法 1、算法原理 2、如何确定K值 3、算法优缺点 二、DBScan聚类 1、算法原理 2、处理步骤 3、算法优缺点 聚类代码实现 聚类算法属于无监督学习,与分类算法这种有监督学习不同的是,聚类算法事先并不需要知道数据的类别标签&am…

高效释放数据价值,数智融合平台有门道

在数字经济时代,数据上升为新的关键生产要素,逐渐超越土地、资本等传统要素,成为社会经济发展和企业创新更加重要的驱动力。 但如何充分释放数据价值在当下依然是一个世界性难题。一方面,企业与组织逐渐拥有海量数据规模和丰富应…

基于CBC、ECB、CTR、OCF、CFB模式的AES加密算法

1、什么是AES加密算法 什么是加密算法?我在文章《从个人角度看什么是加密算法》中描述了我对加密算法的一些浅薄的理解。我不是信息安全领域的大神,只求有一个入门罢了! 这篇文章是文章《从个人角度看什么是加密算法》的延伸,所…

【C++初阶】:缺省函数和函数重载

c入门一.缺省函数二.函数重载1.参数类型不同2.参数个数不同3.参数顺序不同一.缺省函数 缺省函数,顾名思义就是可以在传参时不传或者少传参数的函数。这里举个例子: 完全缺省 上面的就属于全缺省,可以不传任何参数,当然也可以传参…

Codeforces Round 862 (Div. 2) -- D. A Wide, Wide Graph(树的直径 贪心 简单的树形dp)

题目如下: 题意简说: 树上两点 u,vu, vu,v,如果 u,vu, vu,v 的距离大于等于 kkk 则在图 GkG_kGk​ 上 u,vu, vu,v 有一条无向边。 求当 kkk 等于 [1, n] 的时候,图 GkG_kGk​ 的连通块数量。 思路 or 题解: 我们可以…

【服务器】Dell PowerEdge R750 安装GPU

各种教程 官方教程 https://www.dell.com/support/manuals/zh-cn/poweredge-r750/per750_ism_pub/%E5%AE%89%E8%A3%85-gpu?guidguid-6bb1c301-7595-4c6d-b631-b6a5761c6052&langzh-cn 手册PDF版: https://dl.dell.com/content/manual16153190-dell-emc-powe…

OKR与敏捷开发的结合

当你想达成某件事情时,你在内心会有一个设想的期望结果。这是一个非常简单、基本的概念,并且是从很多人小时候就培养起来的。我们可以将这种现象总结一句话: 通过 ________ 来衡量__________ 。 这就是 John Doerr 在其著作《Measure what Ma…

JavaWeb开发 —— Maven

目录 一、概述 1. 介绍 2. 安装 二、maven-idea 集成 1. 配置及创建Maven项目 2. IDEA 创建Maven项目 3. IDEA导入 Maven 项目 三、依赖管理 1. 依赖配置 2. 依赖传递 3. 依赖范围 4. 生命周期 一、概述 1. 介绍 ① Apache Maven 是一个项目管理和构建工…

【UDP报文和TCP协议特性】

目录1.UDP报文1.1报文长度1.2校验和2.TCP协议特性2.1确认应答2.2超时重传2.3连接管理2.3.1三次握手2.3.2四次挥手2.4滑动窗口2.5流量控制2.6拥塞控制2.7延时应答2.8捎带应答2.9面向字节流2.10异常情况3.小结3.1tcp小结3.2tcp和UDp应用场景的差异4.寄语1.UDP报文 udp是传输层最…

【Android】之【内存管理】

一、Android内存运行是如何运行的? 物理内存即移动设备上的ram,当启动一个android程序时,会启动一个dalvik vm进程,系统会给它分配固定的内存空间【16m,32m,64m,不定,没有统一标准,每个虚拟机会有堆内存阈…

【Minecraft开服教程】使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机

文章目录前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址7. 使用固定公网地址远程联机前言 MCSManager是一个开源…

C++ float 数据的保存格式

总体上,在计算机中, float 数据的的保存按照如下转换逻辑:10进制数 >二进制数>科学计数法二进制数>c 条件下下浮点数在内存中的保存格式(这里面有个转换算法,需要理清楚)。 下面举出一个案例&…

Python+selenium自动化测试实战项目(全面,完整,详细)

前言 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过清明一直没有更新,今天整理一下实战项目的代码共大家学习。(注:项目是针对我们公司内部系统的测试,只能内部网络访问,外部网络无…

使用fetch()异步请求API数据实现汇率转换器

任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示,理解异步函数的编写,并且实现这个汇率转换器。 第一步:在工作区初始…

AI失业潮来袭,某些部门裁员过半

历史的车轮滚滚向前,每次生产力的大幅跃进,都会造成一批失业潮。想当年,纺纱机的出现让无数手工作坊的织布师傅失业。如今,在AI技术的催化下,同样的事正在互联网行业的各个领域重演。疯狂的裁员浪潮 “AI15秒做的&…

图神经网络汇总和总结

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED 相关论文阅读分析: 1、EEG-SEED数据集作者的—基线论文阅读和…

LeetCode——二叉树的层序遍历

102. 二叉树的层序遍历 I 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]…