16、服务反模式:纳米服务与事务集成解析

服务反模式:纳米服务与事务集成解析

1. 纳米服务反模式概述

在服务设计中,确定服务的粒度是一项极具挑战性的任务,需要平衡通信开销、系统灵活性和重用潜力等多个因素。纳米服务反模式关注的是服务粒度过于精细的情况。

以常见的计算器服务为例,下面是一个来自 Apache 示例的无状态计算器服务的 WSDL 文件部分内容:

<wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns="http://jws.samples.geronimo.apache.org"
        targetNamespace="http://jws.samples.geronimo.apache.org"
        attributeFormDefault="unqualified"
        elementFormDefault="qualified">
        <xsd:element name="add">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="value1" type="xsd:int"/>
                    <xsd:element name="value2" type="xsd:int"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
        <xsd:element name="addResponse">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="return" type="xsd:int"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
</wsdl:types>
<wsdl:message name="add">
    <wsdl:part name="add" element="tns:add"/>
</wsdl:message>
<wsdl:message name="addResponse">
    <wsdl:part name="addResponse" element="tns:addResponse"/>
</wsdl:message>
<wsdl:portType name="CalculatorPortType">
    <wsdl:operation name="add">
        <wsdl:input name="add" message="tns:add"/>
        <wsdl:output name="addResponse" message="tns:addResponse"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CalculatorSoapBinding" type="tns:CalculatorPortType">
    <soap:binding style="document"
        transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="add">
        <soap:operation soapAction="add" style="document"/>
        <wsdl:input name="add">
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output name="addResponse">
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="Calculator">
    <wsdl:port name="CalculatorPort" binding="tns:CalculatorSoapBinding">
        <soap:address location="http://localhost:8080/jaxws-calculator/calculator"/>
    </wsdl:port>
</wsdl:service>

从这段代码可以看出,实现一个简单的加法功能需要大量的代码和开销。

还有一个来自 MSDN 示例的有状态计算器服务的接口定义:

[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
public interface ICalculator
{
    [OperationContract()]
    int PowerOn();
    [OperationContract()]
    int Add(int value);
    [OperationContract()]
    int Subtract(int value);
    [OperationContract()]
    int Multiply(int value);
    [OperationContract()]
    int Divide(int value);
    [OperationContract()]
    void PowerOff();
}

这两个计算器服务的粒度都非常细,仅能接受数字并返回计算结果。

2. 纳米服务的后果

纳米服务会带来诸多问题,主要包括以下几个方面:
- 性能不佳 :每次向服务发送请求都会产生一系列成本,如调用方的序列化、将调用方进程移动到操作系统网络服务、将消息转换为底层网络协议、在网络上传输、从操作系统网络服务移动到被调用进程以及在被调用进程上反序列化消息等。如果有大量纳米服务运行,这些成本会累积成严重的性能问题。
- 逻辑碎片化 :将原本有意义的内聚服务拆分成微小步骤,会导致逻辑分散在完成业务服务所需的各个部分之间,增加了陷入“结”反模式的风险。
- 开销增加 :开发任何规模的服务的前期成本都相对较高,纳米服务还会带来额外的管理开销,如在服务注册表中跟踪服务、确保其符合策略以及编写配置所需的代码等。与粗粒度服务相比,纳米服务需要更频繁地进行这些操作。

3. 纳米服务的成因

从技术角度来看,纳米服务的产生主要源于对分布式计算的一些错误假设:
- 带宽无限 :尽管带宽不断提升,但在特定环境中仍然有限。例如,在一个项目中,发送大尺寸图像时,由于使用了浪费空间的位图格式而非压缩格式,导致系统性能下降。
- 传输成本为零 :与本地调用相比,通过网络进行的每次调用都会产生大量成本,包括时间成本和为确保足够带宽所需的实际成本。

此外,新手可能会因为不良示例而采用纳米服务。一些供应商提供的示例,如上述计算器服务示例,容易让 SOA 新手或缺乏分布式系统开发经验的人直接模仿,从而实现具有相似粒度的服务。同时,应用编排模式时也存在产生纳米服务的固有风险,因为编排引擎可能会驱动所有流程,即使是非常小的流程。

4. 纳米服务的重构方法

解决纳米服务反模式问题主要有两种方法:
- 合并相关纳米服务 :将相关的纳米服务组合成一个更大的服务。例如,在一个项目中,最初的“邮局服务”仅处理 SMS 消息,后来通过添加发送电子邮件、推文、MMS 等类似功能,使其变得更有意义。
- 重新分配功能 :将纳米服务的功能重新分配到其他服务中。例如,一个服务分配服务(SAS)在项目中成为了性能瓶颈,最终通过转向分布式资源管理来解决问题,让每个服务都能自主决定与哪个服务实例进行通信。

5. 纳米服务的已知例外情况

在以下情况下,使用纳米服务是可以接受的:
- 项目初期 :当采用渐进式的 SOA 方法且不事先规划所有内容时,最初构建的服务可能不会显示出太多业务效益,但仍需要服务的完整开销。例如,“邮局服务”最初仅处理单一类型的消息。
- 构建适配器或桥梁 :当需要构建与其他系统(如遗留系统或第三方系统)的适配器或桥梁时,使用纳米服务可以保留 SOA 的灵活性和可组合性,尽管会带来额外的管理开销。

6. 事务集成反模式概述

假设存在一个订单系统,业务代表希望仅在库存中确保商品可用时才向用户确认订单。从技术角度来看,涉及到订单处理服务和库存处理服务。虽然这看起来是使用事务的典型场景,但实际上并非如此。

事务基于四个基本原则:
- 原子性 :事务是“全有或全无”的,即事务结束时,状态要么完全完成(提交),要么完全撤销(中止)。
- 一致性 :事务中包含的操作一起执行,以保持状态的一致性。
- 隔离性 :在事务进行期间,不属于事务的逻辑不会看到不一致的世界状态。
- 持久性 :事务的后果被保存到持久存储中,以便在系统重启后仍然可用。

创建事务的最简单方法是使用“悲观锁定”,但在现实场景中,悲观锁定很少起作用,因此开发了更高级的锁定机制。然而,所有这些机制都需要为事务持有资源,并且都基于事务内时间较短的假设。

7. 事务集成的后果

事务集成反模式指的是事务跨越服务边界的情况,会带来以下问题:
- 性能问题 :事务会引入时间耦合,需要所有相关操作在大致相同的时间内完成。即使使用乐观锁定,确保一致性所需的协调也需要同步。在 SOA 解决方案中,每个服务可以独立发展,这使得分布式事务的性能问题更加严重。
- 安全威胁 :如果将第三方服务纳入事务,可能会导致外部系统对自己的系统持有锁,从而可能造成拒绝服务的情况。服务边界应该也是信任边界,将事务外部化到第三方或组织内的其他团队可能会带来安全风险。
- 刚性问题 :服务之间的事务会增加服务之间的耦合度,增加了陷入“结”反模式的风险,从而破坏 SOA 的灵活性和可扩展性。

8. 事务集成的成因

事务集成反模式的主要成因包括:
- 对业务理解的变化 :在设计 SOA 时,虽然最初对企业业务有较好的理解,但业务需求会随时间变化,对业务的理解也会不断加深,这使得预先设计的系统难以适应变化。
- 技术供应商的营销 :技术供应商的营销组织会将新的流行语应用到现有的技术上,导致对哪些产品和功能真正与 SOA 相关产生混淆。例如,Microsoft 的 Windows Communication Foundation(WCF)虽然可以用于 SOA,但也提供了事务功能,容易让人错误地将事务用于跨服务集成。

9. 事务集成的重构方法

可以通过以下几种模式来解决事务集成问题,以实现最终一致性:
- 编排模式 :将事务范围和业务流程外部化到编排引擎。编排引擎可以全面了解涉及的服务及其信任级别,以及服务之间的调用关系,从而更好地控制谁在何时执行什么操作。但参与的服务需要具备事务意识并保留内部锁以应对外部约束,因此需要谨慎使用。
- 长事务模式 :长事务基本上是长时间运行的交互,消息相关且属于同一对话,但不具备与 ACID 事务相同的事务保证。

综上所述,纳米服务和事务集成反模式在服务设计中需要引起重视,了解它们的后果、成因和重构方法,有助于构建更高效、灵活和可扩展的 SOA 系统。

以下是纳米服务和事务集成反模式的相关信息总结表格:
| 反模式 | 后果 | 成因 | 重构方法 | 已知例外 |
| ---- | ---- | ---- | ---- | ---- |
| 纳米服务 | 性能不佳、逻辑碎片化、开销增加 | 忽视分布式计算假设、不良示例、编排模式风险 | 合并相关纳米服务、重新分配功能 | 项目初期、构建适配器或桥梁 |
| 事务集成 | 性能问题、安全威胁、刚性问题 | 业务理解变化、技术供应商营销 | 编排模式、长事务模式 | 无 |

下面是纳米服务重构流程的 mermaid 流程图:

graph LR
    A[发现纳米服务] --> B{是否可合并}
    B -- 是 --> C[合并相关纳米服务]
    B -- 否 --> D[重新分配功能]
    C --> E[完成重构]
    D --> E

通过以上内容,我们对纳米服务和事务集成反模式有了更深入的了解,希望能帮助大家在服务设计中避免这些问题。

服务反模式:纳米服务与事务集成解析

10. 纳米服务与事务集成反模式对比

为了更清晰地理解纳米服务和事务集成反模式,我们可以从多个维度进行对比,如下表所示:
| 对比维度 | 纳米服务反模式 | 事务集成反模式 |
| ---- | ---- | ---- |
| 核心问题 | 服务粒度过于精细 | 事务跨越服务边界 |
| 主要后果 | 性能不佳、逻辑碎片化、开销增加 | 性能问题、安全威胁、刚性问题 |
| 成因关键 | 对分布式计算假设错误、不良示例、编排模式风险 | 业务理解变化、技术供应商营销 |
| 重构重点 | 合并或重新分配服务功能 | 使用编排或长事务模式 |
| 适用例外 | 项目初期、构建适配器或桥梁 | 无 |

这种对比有助于我们在实际服务设计中,更准确地识别和区分这两种反模式,从而采取更合适的解决策略。

11. 避免反模式的预防措施

在服务设计过程中,我们可以采取以下预防措施来避免纳米服务和事务集成反模式:
- 前期规划与评估
- 在开始项目之前,对业务需求进行全面深入的分析,确定服务的合理粒度和边界。避免盲目追求细粒度服务,要考虑服务之间的关联性和整体性。
- 评估项目所涉及的网络环境和资源情况,充分认识到带宽和传输成本的限制,避免因忽视这些因素而导致纳米服务的产生。
- 参考优质示例与最佳实践
- 学习和借鉴成熟的 SOA 项目案例,了解它们是如何处理服务粒度和事务管理的。避免直接使用供应商提供的过于简化或不恰当的示例。
- 关注行业内的最佳实践和标准,遵循这些原则进行服务设计,提高服务的质量和可维护性。
- 技术选型与架构设计
- 在选择技术框架和工具时,要明确其适用范围和功能特点,避免被供应商的营销宣传所误导。例如,对于支持事务的技术,要谨慎使用其跨服务集成的功能。
- 设计灵活可扩展的架构,考虑到服务的未来发展和变化,尽量减少服务之间的耦合度,提高系统的灵活性和可演化性。

12. 反模式处理的案例分析

下面通过两个实际案例,进一步说明如何处理纳米服务和事务集成反模式。

案例一:纳米服务处理
某电商系统中,存在多个纳米服务用于处理商品信息的不同方面,如商品名称查询、商品价格查询、商品库存查询等。这些纳米服务导致系统性能低下,逻辑碎片化严重。
处理方法:将这些相关的纳米服务合并成一个商品信息服务,该服务可以一次性提供商品的完整信息,包括名称、价格、库存等。通过这种方式,减少了服务调用次数,提高了系统性能,同时也使业务逻辑更加清晰。

案例二:事务集成处理
在一个金融系统中,订单处理服务和支付服务之间使用了分布式事务,随着业务的发展,系统出现了性能问题和安全隐患。
处理方法:采用编排模式,引入一个编排引擎来协调订单处理和支付流程。编排引擎可以根据业务规则和服务状态,灵活控制服务的调用顺序和时机,避免了直接使用分布式事务带来的问题。同时,参与的服务进行了相应的改造,使其具备事务意识并保留内部锁,以应对外部约束。

13. 未来服务设计的趋势与反模式应对

随着技术的不断发展,服务设计领域也呈现出一些新的趋势,如微服务架构的广泛应用、云原生技术的兴起等。在这些新趋势下,纳米服务和事务集成反模式仍然可能存在,但也有了新的应对思路。

  • 微服务架构下的反模式应对

    • 微服务架构强调服务的细粒度和独立性,但也容易导致纳米服务的产生。为了避免这种情况,需要更加注重服务之间的协作和聚合,通过合理的服务划分和组合,确保每个微服务都具有足够的业务价值。
    • 在事务处理方面,可以采用基于消息队列的异步通信方式,实现最终一致性,避免使用分布式事务带来的问题。
  • 云原生技术下的反模式应对

    • 云原生技术提供了强大的弹性伸缩和自动化管理能力,但也增加了服务之间的复杂性。在设计云原生服务时,要充分利用云平台的特性,如容器化、编排工具等,优化服务的部署和运行环境,减少纳米服务和事务集成反模式的影响。
    • 可以借助云平台提供的监控和日志工具,及时发现和解决反模式带来的问题,提高系统的可靠性和稳定性。
14. 总结与建议

纳米服务和事务集成反模式在服务设计中是常见的问题,它们会对系统的性能、可维护性和安全性产生负面影响。为了避免这些反模式,我们需要在项目的各个阶段采取相应的措施:
- 在设计阶段,要充分考虑服务的粒度和事务管理,避免过度细化服务和跨服务使用事务。
- 在开发过程中,参考优质示例和最佳实践,选择合适的技术和架构,确保服务的质量和可扩展性。
- 在运维阶段,利用监控和日志工具,及时发现和解决反模式带来的问题,不断优化系统。

同时,随着技术的发展,我们要不断学习和适应新的趋势,采用新的方法和技术来应对反模式,构建更加高效、灵活和可靠的服务系统。

下面是一个服务设计过程中避免反模式的 mermaid 流程图:

graph LR
    A[需求分析] --> B{是否存在纳米服务风险}
    B -- 是 --> C[调整服务粒度]
    B -- 否 --> D{是否存在事务集成风险}
    C --> D
    D -- 是 --> E[优化事务管理]
    D -- 否 --> F[正常开发]
    E --> F
    F --> G[系统部署]
    G --> H[监控与优化]
    H --> I{是否出现反模式问题}
    I -- 是 --> J[解决问题并优化]
    I -- 否 --> K[持续运行]
    J --> H

通过以上的内容,我们全面深入地了解了纳米服务和事务集成反模式,希望这些知识能够帮助大家在服务设计和开发中避免这些问题,提升系统的整体性能和质量。

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑用户体验的优化,从而提升整体开发效率软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值