0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是业务补偿?业务补偿设计的实现方式

jf_ro2CN3Fa 来源:栗筝i 2023-04-10 10:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们知道,应用系统在分布式的情况下,在通信时会有着一个显著的问题,即一个业务流程往往需要组合一组服务,且单单一次通信可能会经过 DNS 服务,网卡、交换机、路由器、负载均衡等设备,而这些服务于设备都不一定是一直稳定的,在数据传输的整个过程中,只要任意一个环节出错,都会导致问题的产生。

这样的事情在微服务下就更为明显了,因为业务需要在一致性上的保证。也就是说,如果一个步骤失败了,要么不断重试保证所有的步骤都成功,要么回滚到以前的服务调用。

因此我们可以对业务补偿的过程进行一个定义,即当某个操作发生了异常时,如何通过内部机制将这个异常产生的「不一致」状态消除掉。

一、关于业务补偿机制

1、什么是业务补偿

我们知道,应用系统在分布式的情况下,在通信时会有着一个显著的问题,即一个业务流程往往需要组合一组服务,且单单一次通信可能会经过 DNS 服务,网卡、交换机、路由器、负载均衡等设备,而这些服务于设备都不一定是一直稳定的,在数据传输的整个过程中,只要任意一个环节出错,都会导致问题的产生。

这样的事情在微服务下就更为明显了,因为业务需要在一致性上的保证。也就是说,如果一个步骤失败了,要么不断重试保证所有的步骤都成功,要么回滚到以前的服务调用。

因此我们可以对业务补偿的过程进行一个定义,即当某个操作发生了异常时,如何通过内部机制将这个异常产生的「不一致」状态消除掉。

2、业务补偿设计的实现方式

业务补偿设计的实现方式主要可分为两种:

回滚(事务补偿) ,逆向操作,回滚业务流程,意味着放弃,当前操作必然会失败;

重试 ,正向操作,努力地把一个业务流程执行完成,代表着还有成功的机会。

一般来说,业务的事务补偿都是需要一个工作流引擎的。这个工作流引擎把各式各样的服务给串联在一起,并在工作流上做相应的业务补偿,整个过程设计成为最终一致性的。

Ps:因为「补偿」已经是一个额外流程了,既然能够走这个额外流程,说明时效性并不是第一考虑的因素。所以做补偿的核心要点是:宁可慢,不可错。

二、关于回滚

“回滚” 是指当程序或数据出错时,将程序或数据恢复到最近的一个正确版本的行为。在分布式业务补偿设计到的回滚则是通过事务补偿的方式,回到服务调用以前的状态。

1、显示回滚

回滚一般可分为 2 种模式:

显式回滚 ;调用逆向接口,进行上一次操作的反操作,或者取消上一次还没有完成的操作(须锁定资源);

隐式回滚 :隐式回滚意味着这个回滚动作你不需要进行额外处理,往往是由下游提供了失败处理机制的。

最常见的就是「显式回滚」。这个方案无非就是做 2 个事情:

首先要确定失败的步骤和状态,从而确定需要回滚的范围。一个业务的流程,往往在设计之初就制定好了,所以确定回滚的范围比较容易。但这里唯一需要注意的一点就是:如果在一个业务处理中涉及到的服务并不是都提供了「回滚接口」,那么在编排服务时应该把提供「回滚接口」的服务放在前面,这样当后面的工作服务错误时还有机会「回滚」。

其次要能提供「回滚」操作使用到的业务数据。「回滚」时提供的数据越多,越有益于程序的健壮性。因为程序可以在收到「回滚」操作的时候可以做业务的检查,比如检查账户是否相等,金额是否一致等等。

2、回滚的实现方式

对于跨库的事务,比较常见的解决方案有:两阶段提交、三阶段提交(ACID)但是这 2 种方式,在高可用的架构中一般都不可取,因为跨库锁表会消耗很大的性能。

高可用的架构中一般不会要求强一致性,只要达到最终的一致性就可以了。可以考虑:事务表、消息队列、补偿机制、TCC 模式(占位 / 确认或取消)、Sagas模式(拆分事务 + 补偿机制)来实现最终的一致性。

三、关于重试

“重试” 的语义是我们认为这个故障是暂时的,而不是永久的,所以,我们会去重试。这个操作最大的好处就是不需要提供额外的逆向接口。这对于代码的维护和长期开发的成本有优势,而且业务是变化的。逆向接口也需要变化。所以更多时候可以考虑重试。

1、重试的使用场景

相较于回滚,重试使用的场景要少一些:下游系统返回请求超时,被限流中等临时状态的时候,我们就可以考虑重试了。而如果是返回余额不足,无权限的明确业务错误,就不需要重试。一些中间件或者 RPC 框架,返回 503,404 这种没有预期恢复时间的错误,也不需要重试了。

2、重试策略

重试的时间和重试的次数。这种在不同的情况下要有不同的考量,主流的重试策略主要是以下几种:

策略 1 - 立即重试 :有时候故障是暂时性的,可能因为网络数据包冲突或者硬件组件高峰流量等事件造成的,在这种情况下,适合立即重试的操作。不过立即重试的操作不应该超过一次,如果立即重试失败,应该改用其他策略;

策略 2 - 固定间隔 :这个很好理解,比如每隔 5 分钟重试一次。PS:策略 1 和策略 2 多用于前端系统的交互操作中;

策略 3 - 增量间隔 :每一次的重试间隔时间增量递增。比如,第一次 0 秒、第二次 5 秒、第三次 10 秒这样,使得失败次数越多的重试请求优先级排到越后面,给新进入的重试请求让路;

return(retryCount-1)*incrementInterval;

策略 4 - 指数间隔: 每一次的重试间隔呈指数级增加。和增量间隔一样,都是想让失败次数越多的重试请求优先级排到越后面,只不过这个方案的增长幅度更大一些;

return2^retryCount;

策略 5 - 全抖动: 在递增的基础上,增加随机性(可以把其中的指数增长部分替换成增量增长。)适用于将某一时刻集中产生的大量重试请求进行压力分散的场景;

returnrandom(0,2^retryCount);

策略 6 - 等抖动: 在「指数间隔」和「全抖动」之间寻求一个中庸的方案,降低随机性的作用。适用场景和「全抖动」一样。

intbaseNum=2^retryCount;
returnbaseNum+random(0,baseNum);

策略 - 3、4、5、6 的表现情况大致是这样(x轴为重试次数):

882edae4-d6c8-11ed-bfe3-dac502259ad0.png

3、重试时的注意事项

首先对于需要重试的接口,是需要做成幂等性的,即不能因为服务的多次调用而导致业务数据的累计增加或减少。

满足「幂等性」其实就是需要想办法识别重复的请求,并且将其过滤掉。思路就是:

给每个请求定义一个唯一标识。

在进行「重试」的时候判断这个请求是否已经被执行或者正在被执行,如果是则抛弃该请求。

Ps:此外重试特别适合在高负载情况下被降级,当然也应当受到限流和熔断机制的影响。当重试的“矛”与限流和熔断的“盾”搭配使用,效果才是最好。

四、业务补偿机制的注意事项

1、ACID 还是 BASE

ACID 和 BASE 是分布式系统中两种不同级别的一致性理论,在分布式系统中,ACID有更强的一致性,但可伸缩性非常差,仅在必要时使用;BASE的一致性较弱,但有很好的可伸缩性,还可以异步批量处理;大多数分布式事务适合 BASE。

而在重试或回滚的场景下,我们一般不会要求强一致性,只要保证最终一致性就可以了!

2、业务补偿设计的注意事项

业务补偿设计的注意事项:

因为要把一个业务流程执行完成,需要这个流程中所涉及的服务方支持幂等性。并且在上游有重试机制;

我们需要小心维护和监控整个过程的状态,所以,千万不要把这些状态放到不同的组件中,最好是一个业务流程的控制方来做这个事,也就是一个工作流引擎。所以,这个工作流引擎是需要高可用和稳定的;

补偿的业务逻辑和流程不一定非得是严格反向操作。有时候可以并行,有时候,可能会更简单。总之,设计业务正向流程的时候,也需要设计业务的反向补偿流程;

我们要清楚地知道,业务补偿的业务逻辑是强业务相关的,很难做成通用的;

下层的业务方最好提供短期的资源预留机制。就像电商中的把货品的库存预先占住等待用户在 15 分钟内支付。如果没有收到用户的支付,则释放库存。然后回滚到之前的下单操作,等待用户重新下单。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据传输
    +关注

    关注

    9

    文章

    2076

    浏览量

    67173
  • 交换机
    +关注

    关注

    23

    文章

    2868

    浏览量

    103915
  • 路由器
    +关注

    关注

    22

    文章

    3890

    浏览量

    118876
  • DNS
    DNS
    +关注

    关注

    0

    文章

    228

    浏览量

    21015

原文标题:浅谈分布式系统中的补偿机制设计问题

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    晶振温度系数补偿技术的三种主要方式

    石英晶振决定着设备的节奏与精准度,但温度变化会让晶振的频率悄悄偏移,从而影响通信、定位和时钟同步的稳定性。晶振温度补偿可通过补偿温度带来的频率漂移,让系统在各种环境下都保持高精度运行。
    的头像 发表于 11-17 11:08 501次阅读
    晶振温度系数<b class='flag-5'>补偿</b>技术的三种主要<b class='flag-5'>方式</b>

    程序线性补偿和传感器本身硬件补偿有什么区别?

    程序线性补偿和传感器硬件补偿,涉及到传感器信号处理的两种核心思路。我们来详细拆解一下它们的区别。简单来说:传感器本身硬件补偿:是在物理层面,通过额外的硬件元件或专用芯片,直接在传感器内部或电路板上
    的头像 发表于 10-29 12:02 175次阅读
    程序线性<b class='flag-5'>补偿</b>和传感器本身硬件<b class='flag-5'>补偿</b>有什么区别?

    AppGallery Connect(Harmony0S 5及以上)--公开测试业务介绍

    测试用户。公开测试和其他测试方式区别如下,您可以根据实际业务需求,选择合适的测试方式。 本文主要从参考引用自HarmonyOS官方文档
    发表于 09-22 16:54

    电力系统的“智慧心脏”:ARC控制器实现无功自动补偿

    在当今电力需求不断增长、能源效率日益收到重视的背景下,无功补偿已成为提升电网质量、降低线损、节约用电成本的关键技术。安科瑞推出的ARC系列低压无功补偿控制器,正如电力系统的“智慧心脏”,通过精准
    的头像 发表于 09-09 14:38 527次阅读
    电力系统的“智慧心脏”:ARC控制器<b class='flag-5'>实现</b>无功自动<b class='flag-5'>补偿</b>

    请问如何使用低功耗 UART (LP UART) 波特率补偿

    如何使用低功耗 UART (LP UART) 波特率补偿
    发表于 08-21 07:05

    基于死区补偿的电机低速运行稳定性研究

    摘 要:电机低速运行时,死区效应可能导致电流波形畸变严重,使电机转矩发生脉动。本文提出一种新型PWM控制死区补偿方法,该控制算法通过坐标变换、定标的方式将合成电流空间矢量与定子旋转磁场同步,根据电流
    发表于 07-29 16:21

    为何有些充电桩箱变不用补偿?来看分享

    在充电桩行业,“是否需要无功补偿”常被运营商讨论——有的箱变装了大容量补偿装置,有的却“裸奔”运行。难道是厂家偷工减料?还是技术进步的“新玩法”?今天就从技术原理、实际场景和成本逻辑出发,拆解这个
    的头像 发表于 07-08 09:11 1498次阅读
    为何有些充电桩箱变不用<b class='flag-5'>补偿</b>?来看分享

    请问运放电路有哪些补偿方法以及如何补偿

    曲线和相位特性曲线尽可能的实现单位频率增益和单位相位增益的补偿; 除此之外还有什么超前补偿和滞后补偿,这又是根据什么划分的,能否举出一个实例电路简述超前
    发表于 03-24 06:20

    OptiSystem-系统角度下分析色散补偿方案

    色散补偿在2.5和10 Gbps比特率下的系统性能。眼图所示为-12和10 dBm信号功率。 利用DCM实现色散补偿 我们现在将展示补偿色散量如何影响系统性能。我们将使用一个理想的色散
    发表于 03-20 18:20

    补偿导线可以当电线用吗,补偿导线有哪几种类型

    在电子与电气工程领域,导线作为电能与信息传输的基础元件,其种类繁多,各具特色。补偿导线与常规电线便是其中两类,它们在功能、设计与应用上存在显著差异。本文将深入探讨补偿导线与常规电线的区别、补偿导线的类型及其独特应用,为技术人员提
    的头像 发表于 01-30 15:51 2957次阅读

    补偿导线的作用是什么?使用时注意哪些事项?

    在温度测量与控制领域,补偿导线作为一种关键的传输媒介,扮演着至关重要的角色。它不仅能够有效延长热电偶的冷端,还能补偿因环境温度变化而引起的测温误差,确保温度测量的准确性和稳定性。本文将深入探讨补偿导线的作用、使用时的注意事项及其
    的头像 发表于 01-30 15:49 4095次阅读

    无功补偿故障原因及解决方法

    无功补偿故障可能由多种原因引起,以下是一些常见的故障原因及其解决方法:
    的头像 发表于 01-29 14:25 2619次阅读

    光伏电站中无功补偿和SVG有什么联系

      无功补偿的主要作用就是提高功率因数,以减少设备容量和功率损耗,稳定电压和提高供电质量。   无功补偿装置的类型光伏电站运维    无功补偿装置有很多种类型,比如并联电容器、同步调相机,还有我们
    的头像 发表于 01-23 14:09 1610次阅读
    光伏电站中无功<b class='flag-5'>补偿</b>和SVG有什么联系

    饱和蒸汽流量计测量时补偿方式的选择

    在饱和蒸汽流量测量中,补偿方式的选择是确保测量准确性的关键。由于饱和蒸汽的密度与温度或压力之间存在固定的对应关系,因此可以通过温度补偿或压力补偿来修正测量结果。对于饱和蒸汽来说,可以只
    的头像 发表于 12-29 09:38 772次阅读

    如何调谐(补偿)X10 示波器探头

    衰减示波器探头 为了最大限度地减少被测设备上的电容负载,大多数探头都使用 x10(也称为 10:1)衰减器。通常可以对此进行调整或补偿,以改善频率响应。以下注释使用两个具有不同调整布置的示例探头解释
    的头像 发表于 12-13 13:51 1299次阅读
    如何调谐(<b class='flag-5'>补偿</b>)X10 示波器探头