为什么要 讨论 SOA 呢 ?

请参考我写的另一篇文章 《论 微服务 和 Entity Framework 对 数据 的 割裂》    https://www.cnblogs.com/KSongKing/p/10124126.html

我们来 看看 SOA 的 架构图 :

可以看到, 在 BL 上 套一层 Remote Facade(远程外观), 就成为了 Service(服务),

实质就是, BL = Service = 业务,   服务 只是 将 业务 发布 出来, 使得 其它 应用程序 可以访问 。

大家可以 对比 看看 , 微服务 和 SOA , 有什么 不同 呢 ?

服务 间 的 事务(Transaction), 是一个 经典 的 问题 。

也是 一个 首要 的 问题 。

比如,  一个业务 里 更新了 本身的 数据库, 又 调用了 A 服务, B 服务,

如果 A 服务 成功, B 服务 失败, 则 A 服务 应该“回滚”(Rollback),

解决的 办法 是, 每个服务应该 提供一个 对应的 “取消”(Cancel)服务, 比如 A() 服务 应该对应有一个 ACancel() 服务,

B() 服务 应该对应有一个 BCancel() 服务,

这样, 在 业务失败 时, 可以调用  ACancel() 服务 来 “撤销” A() 服务 造成 的 更改 。

为什么要说  “撤销”,  而不说  “回滚” 呢 ?

回滚 意味着 数据 恢复到 更新前 的 状态 ,  在 服务 的 层面, 这通常很难做到 。

在 服务 的 层面, 按 业务 的 意义 进行  “撤销”  会 更合适 。

比如 , 我 申请 了 一张表单, 可以 撤回表单;  下了一个 订单, 可以 撤销订单 ;  支付了 一笔钱, 可以 退款 ;   等等 。

可以按照这样的 规范 来 命名 :   A() 服务 对应 的 撤销方法 是 ACancel() 服务, 即通过 “Cancel” 后缀 来 表明 。

但 ACancel()  方法 的 业务意义 是 什么, 比如 是 撤回表单, 还是 删除表单, 或是 取消订单, 或是 删除订单, 或是 退款,

这个 应由 服务 的 API 文档 明确 的 说明 。

确立了 “撤销”(Cancel) 实现 事务 的 架构 后,

就可以 开始 研究 具体 的 解决方案 。

可以有 2 个 解决方案,

1 程序解决

2 人工解决

我们先说说 人工解决,

通过 界面 将 “撤销”服务(如 ACancel()) 提供出来,  在 业务失败 的 时候, 通知 客服人员 手动 撤销 已执行 的 服务 。

通知方式 比如 发 Mail , 短信 等 。

再说说 程序解决,  程序解决 就是 在程序中 控制, 如果 业务失败 则 撤销 已执行 的 服务(如  调用 ACancel()) 。

最简单 的 程序解决 就是 在 业务失败 的时候, 调用 撤销服务(如 ACancel()), 如果 在 撤销 过程中 也发生错误, 则 通知 客服 转入 人工处理 。

通知方式 比如 发 Mail , 短信 等 。

进一步, 自动化程度高的 , 严格的  撤销机制 则 需要 实现一个 类似 数据库 的 事务机制, 或者说 事务控制器 。

需要将 事务 状态 记录为 事务日志 , 持久化在 文件 或者 数据库 中, 只到 整个 事务 完成, 则 事务日志 中的 事务状态 才会 变成 成功 。

事务完成 包含 成功 和 失败且撤回成功 。

要做到 这些 技术比较复杂, 也会对 性能 带来 影响 。 也会让 开发 和 维护 变得 更复杂 。

这种机制 的 好处 是 自动化程度高, 精确, 适用于 严格精确 的 场合, 如 金融 。

当然, 自动化 ,严格 这不是 绝对 的,  有时候 也需要 人工介入,  但 概率 比较 小 。

大家可能会说, 金融行业 用 这种 架构 不是 用的 很 嗨 吗 ?   为什么说 这种 架构 会 让 开发 和 维护 变得 复杂呢 ?

能不能 在 一般 的 业务系统 互联网应用 商业应用 中 也使用 这种 架构(机制) 呢 ?

金融业中用这种架构的, 应该是 支付(交易) 的 基础架构, 这部分 很少 会   “变, 动” ,

其次, 这部分 基础架构 要  “变, 动” 的话, 通常 需要  “专业的技术人员”  才能实施 。

这和 一般的 业务系统 互联网应用 商业应用 的 要求 是 不一样的 。

对于  小型团队 小型项目, 中型团队 中型项目,  人工为主 的 方式 基本上应该够了 。

对于  SaaS,   客服的部分可以交给 各级服务商 来做,  这样, 人力也不是问题 。

谈谈 SOA的更多相关文章

  1. 简单聊聊SOA和微服务

    转自:https://juejin.im/post/592f87feb123db0064e5ef7c  (2017-06) 简单聊聊SOA和微服务 架构设计中的朴素主义 前两天和一个朋友聊天,他向我咨 ...

  2. 阿里P8架构师谈:Restful、SOAP、RPC、SOA、微服务之间的区别(转载)

    转载来源:https://youzhixueyuan.com/the-difference-between-restful-soap-rpc-soa-and-micro-service.html 内容 ...

  3. 论 微服务 和 Entity Framework 对 数据 的 割裂

    微服务 的 本质 是 面向对象, 微服务 是 面向对象 对 数据中心 发起的挑战, 在 微服务 架构下, “数据为中心” 的 传统架构 被 严重 割裂, 微服务 的 先天矛盾, 是 对象 和 数据 的 ...

  4. 请谈谈对SOA的认识。

    请谈谈对SOA的认识. 解答:面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接 ...

  5. 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解(转载)

    相关参考文章: 谈谈自己对REST.SOA.SOAP.RPC.ICE.ESB.BPM知识汇总及理解 微服务SOA架构与RPC远程过程调用 SOA和微服务架构的区别 SOA: 维基百科解释:SOA:面向 ...

  6. 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解

    转载自:https://blog.csdn.net/tantexian/article/details/48196453 SOA: 维基百科解释:SOA:面向服务的软件架构(Service Orien ...

  7. 谈谈 数据中心SOA 架构

    为什么要讨论 数据中心SOA 架构呢? 请参考我写的另外一篇文章  <论 微服务 和 Entity Framework 对数据的割裂>    https://www.cnblogs.com ...

  8. 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、XML、JSON

    引子: 关于SOAP其实我一直模模糊糊不太理解,这种模模糊糊的感觉表述起来是这样: 在使用web服务时(功能接口),本来我就可以通过安卓中固有的http类(使用http协议),来发送http请求,并且 ...

  9. 谈谈分布式事务之一:SOA需要怎样的事务控制方式

    在一个基于SOA架构的分布式系统体系中,服务(Service)成为了基本的功能提供单元,无论与业务流程无关的基础功能,还是具体的业务逻辑, 均实现在相应的服务之中.服务对外提供统一的接口,服务之间采用 ...

随机推荐

  1. 用Filter实现图片防盗链

    首先继承自FilterAttribute类同时实现IActionFilter接口,代码如下: //// <summary> /// 防盗链Filter. /// </summary& ...

  2. <Spark Streaming><Flume><Integration>

    Overview Flume:一个分布式的,可靠的,可用的服务,用于有效地收集.聚合.移动大规模日志数据 我们搭建一个flume + Spark Streaming的平台来从Flume获取数据,并处理 ...

  3. 九、编写led驱动

    led.c #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #i ...

  4. vnode的挂载和更新流程 -- 简介.

    来源 vnode原理 diff图解 <div id="app"> {{someVar}} </div> <script type="text ...

  5. 适用于WIFI Hacking的无线网卡推荐

    相信很多初次使用Kali Linux来进行无线渗透的小伙伴都曾遇到过一个非常头疼的问题,就是不知道如何选购一款合适的无线网卡.因为Kali Linux并不是所有的网卡都支持,一旦选错了网卡不仅会给我们 ...

  6. Python socket简单操作

    #服务端:#导入socket模块 import socket #创建socket对象,创建了一个手机 server = socket.socket() #给程序设置一个ip地址和端口号,买了个手机卡 ...

  7. Primise --(mongoose's default promise library)

    今天在学nodejs的时候,遇到一个错误;刚开始完全不知道说的是什么,为什么会出现这个错误 DeprecationWarning: Mongoose: mpromise (mongoose's def ...

  8. Threejs着色器基本使用样例改造

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - bu ...

  9. [LeetCode&Python] Problem 169. Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  10. Sublime Text 3(中文)在Windows下的配置、安装、运行

    Sublime Text 3(中文)下载.安装.运行! 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 具体 ...