2026/1/10 2:57:54
网站建设
项目流程
网上申请个人营业执照网站,263企业邮箱网页登录入口,贵州省城乡与建设厅网站,网站制作公司有哪些我们知道#xff0c;应用系统在分布式的情况下#xff0c;在通信时会有着一个显著的问题#xff0c;即一个业务流程往往需要组合一组服务#xff0c;且单单一次通信可能会经过 DNS 服务#xff0c;网卡、交换机、路由器、负载均衡等设备#xff0c;而这些服务于设备都不一…我们知道应用系统在分布式的情况下在通信时会有着一个显著的问题即一个业务流程往往需要组合一组服务且单单一次通信可能会经过 DNS 服务网卡、交换机、路由器、负载均衡等设备而这些服务于设备都不一定是一直稳定的在数据传输的整个过程中只要任意一个环节出错都会导致问题的产生。这样的事情在微服务下就更为明显了因为业务需要在一致性上的保证。也就是说如果一个步骤失败了要么不断重试保证所有的步骤都成功要么回滚到以前的服务调用。因此我们可以对业务补偿的过程进行一个定义即当某个操作发生了异常时如何通过内部机制将这个异常产生的「不一致」状态消除掉。一、关于业务补偿机制1、什么是业务补偿我们知道应用系统在分布式的情况下在通信时会有着一个显著的问题即一个业务流程往往需要组合一组服务且单单一次通信可能会经过 DNS 服务网卡、交换机、路由器、负载均衡等设备而这些服务于设备都不一定是一直稳定的在数据传输的整个过程中只要任意一个环节出错都会导致问题的产生。这样的事情在微服务下就更为明显了因为业务需要在一致性上的保证。也就是说如果一个步骤失败了要么不断重试保证所有的步骤都成功要么回滚到以前的服务调用。因此我们可以对业务补偿的过程进行一个定义即当某个操作发生了异常时如何通过内部机制将这个异常产生的「不一致」状态消除掉。2、业务补偿设计的实现方式业务补偿设计的实现方式主要可分为两种回滚事务补偿 逆向操作回滚业务流程意味着放弃当前操作必然会失败重试 正向操作努力地把一个业务流程执行完成代表着还有成功的机会。一般来说业务的事务补偿都是需要一个工作流引擎的。这个工作流引擎把各式各样的服务给串联在一起并在工作流上做相应的业务补偿整个过程设计成为最终一致性的。Ps因为「补偿」已经是一个额外流程了既然能够走这个额外流程说明时效性并不是第一考虑的因素。所以做补偿的核心要点是宁可慢不可错。二、关于回滚“回滚” 是指当程序或数据出错时将程序或数据恢复到最近的一个正确版本的行为。在分布式业务补偿设计到的回滚则是通过事务补偿的方式回到服务调用以前的状态。1、显示回滚回滚一般可分为 2 种模式显式回滚 调用逆向接口进行上一次操作的反操作或者取消上一次还没有完成的操作须锁定资源隐式回滚 隐式回滚意味着这个回滚动作你不需要进行额外处理往往是由下游提供了失败处理机制的。最常见的就是「显式回滚」。这个方案无非就是做 2 个事情首先要确定失败的步骤和状态从而确定需要回滚的范围。一个业务的流程往往在设计之初就制定好了所以确定回滚的范围比较容易。但这里唯一需要注意的一点就是如果在一个业务处理中涉及到的服务并不是都提供了「回滚接口」那么在编排服务时应该把提供「回滚接口」的服务放在前面这样当后面的工作服务错误时还有机会「回滚」。其次要能提供「回滚」操作使用到的业务数据。「回滚」时提供的数据越多越有益于程序的健壮性。因为程序可以在收到「回滚」操作的时候可以做业务的检查比如检查账户是否相等金额是否一致等等。2、回滚的实现方式对于跨库的事务比较常见的解决方案有两阶段提交、三阶段提交ACID但是这 2 种方式在高可用的架构中一般都不可取因为跨库锁表会消耗很大的性能。高可用的架构中一般不会要求强一致性只要达到最终的一致性就可以了。可以考虑事务表、消息队列、补偿机制、TCC 模式占位 / 确认或取消、Sagas模式拆分事务 补偿机制来实现最终的一致性。三、关于重试“重试” 的语义是我们认为这个故障是暂时的而不是永久的所以我们会去重试。这个操作最大的好处就是不需要提供额外的逆向接口。这对于代码的维护和长期开发的成本有优势而且业务是变化的。逆向接口也需要变化。所以更多时候可以考虑重试。1、重试的使用场景相较于回滚重试使用的场景要少一些下游系统返回请求超时被限流中等临时状态的时候我们就可以考虑重试了。而如果是返回余额不足无权限的明确业务错误就不需要重试。一些中间件或者 RPC 框架返回 503404 这种没有预期恢复时间的错误也不需要重试了。2、重试策略重试的时间和重试的次数。这种在不同的情况下要有不同的考量主流的重试策略主要是以下几种策略 1 - 立即重试 有时候故障是暂时性的可能因为网络数据包冲突或者硬件组件高峰流量等事件造成的在这种情况下适合立即重试的操作。不过立即重试的操作不应该超过一次如果立即重试失败应该改用其他策略策略 2 - 固定间隔 这个很好理解比如每隔 5 分钟重试一次。PS策略 1 和策略 2 多用于前端系统的交互操作中策略 3 - 增量间隔 每一次的重试间隔时间增量递增。比如第一次 0 秒、第二次 5 秒、第三次 10 秒这样使得失败次数越多的重试请求优先级排到越后面给新进入的重试请求让路return (retryCount - 1) * incrementInterval;策略 4 - 指数间隔 每一次的重试间隔呈指数级增加。和增量间隔一样都是想让失败次数越多的重试请求优先级排到越后面只不过这个方案的增长幅度更大一些return 2 ^ retryCount;策略 5 - 全抖动 在递增的基础上增加随机性可以把其中的指数增长部分替换成增量增长。适用于将某一时刻集中产生的大量重试请求进行压力分散的场景return random(0 , 2 ^ retryCount);策略 6 - 等抖动 在「指数间隔」和「全抖动」之间寻求一个中庸的方案降低随机性的作用。适用场景和「全抖动」一样。int baseNum 2 ^ retryCount; return baseNum random(0 , baseNum);策略 - 3、4、5、6 的表现情况大致是这样x轴为重试次数3、重试时的注意事项首先对于需要重试的接口是需要做成幂等性的即不能因为服务的多次调用而导致业务数据的累计增加或减少。满足「幂等性」其实就是需要想办法识别重复的请求并且将其过滤掉。思路就是给每个请求定义一个唯一标识。在进行「重试」的时候判断这个请求是否已经被执行或者正在被执行如果是则抛弃该请求。Ps此外重试特别适合在高负载情况下被降级当然也应当受到限流和熔断机制的影响。当重试的“矛”与限流和熔断的“盾”搭配使用效果才是最好。四、业务补偿机制的注意事项1、ACID 还是 BASEACID 和 BASE 是分布式系统中两种不同级别的一致性理论在分布式系统中ACID有更强的一致性但可伸缩性非常差仅在必要时使用BASE的一致性较弱但有很好的可伸缩性还可以异步批量处理大多数分布式事务适合 BASE。而在重试或回滚的场景下我们一般不会要求强一致性只要保证最终一致性就可以了2、业务补偿设计的注意事项业务补偿设计的注意事项因为要把一个业务流程执行完成需要这个流程中所涉及的服务方支持幂等性。并且在上游有重试机制我们需要小心维护和监控整个过程的状态所以千万不要把这些状态放到不同的组件中最好是一个业务流程的控制方来做这个事也就是一个工作流引擎。所以这个工作流引擎是需要高可用和稳定的补偿的业务逻辑和流程不一定非得是严格反向操作。有时候可以并行有时候可能会更简单。总之设计业务正向流程的时候也需要设计业务的反向补偿流程我们要清楚地知道业务补偿的业务逻辑是强业务相关的很难做成通用的下层的业务方最好提供短期的资源预留机制。就像电商中的把货品的库存预先占住等待用户在 15 分钟内支付。如果没有收到用户的支付则释放库存。然后回滚到之前的下单操作等待用户重新下单。最后作为一位过来人也是希望大家少走一些弯路在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈这些资料希望能给你前进的路上带来帮助。视频文档获取方式这份文档和视频资料对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你以上均可以分享点下方小卡片即可自行领取。