如何一步步设计一款微服务的补偿方案

背景
随着微服务化的系统越来越多,系统间的交互也呈现几何倍增的趋势,系统间面临一致性问题越来越突出。为了保障服务提供方与服务消费方的一致性,特别是面临最大努力通知型或补偿性的技术需求,服务化前做法是服务提供方需手写重试策略及各种配置->持久化消息->定时去处理消息等。它带来的以下问题是:
1.客户端(新微服务)要做的重复性工作越来越多?需每个开发者熟悉它,去实现它;
2.这个为什么这样个性化?标准不统一,出错率上升;
3.说好的快速响应呢?我要做的狠简单,最好一行代码就可以实现它;
4.维护成本上升;
接入须知
运行环境
spring3.2.12(内部大多系统使用);
springcloud Brixton系列(新系统);
客户端与服务端遵循规约
接入系统(服务消费方)retry的代码块的颗粒度要求,但凡发起的remote调用,可独立为一个方法,方法内不允许有前置或后置处理,确保粒度控制在远程调用领域;
服务调用方的接口需满足幂等性设计;
接入系统(服务消费方),为了避免理解有歧义,使用范围更规范,retry的作用于仅限于RetryCallable规约接口的实现方
功能特性
retry-client
全局开关,可配置自动扫描并注入;

重试配置级别定义,支持类级和方法级(存在优先级);

重试配置项支持:

include:支持的异常,类型:Class<? extends Throwable>[]
execPolicy:执行策略,默认同步
maxAttempts:重试次数,默认为3
delay:延迟执行毫秒数,默认为0
multiplier:重试执行间隔,默认为0
recoverMethod:回退的方法,重试失败后执行的方法,默认为null
callbackUrl:回调的url(相对url),默认为null,不支持回调
isSendQueue:是否发送队列,默认true
..
同步策略,支持阻塞一直到成功或失败(最大次数);

异步策略,首次失败后,直接返回客户端(需处理中间状态),后续一直重试,成功则回调;

回调支持,主要是针对异步策略,客户端需提供回调接口;

回退支持,可自定义通常达到最大次数后执行;

重试失败消息落地,支持发送MQ

retry-server
消费消息并落地;
定时处理库存中的请求,直到成功;
可根据errorcode进行配置终止重试;
成功时支持回调;
失败时发送短信和邮件给系统责任人
实现报表统计功能,可以展示top10接口调用失败后重试的情况
尚未实现
retry-server 在执行重试或回调时,目标服务需提供无状态接口(不携带cookie),对身份授权有依赖需关注;
retry-server 执行重试间隔暂时不按照retry-client声明的定义,它统一集中化配置在项目中;
retry-client 目前仅限于发起的esb,feign(springcloud)调用,至于要支持各种业务代码方法的重试(远程方面需慎重考虑)
设计要求
无侵入:不改动当前的业务逻辑,对于需要重试的地方,可以很简单的实现;
通用性:可自定义包括重试次数,重试的间隔时间,是否使用异步方式等配置;
拓展性:关键实现的可替换(SPI),同时API设计满足开放闭合原则;
健壮性:可监听所以关键的实现,便于排查问题,支持各种异常情况的处理,支持当前springcloud及spring3.x版本系列的接入;
具体实现
组件设计

https://github.com/alex2chen/compensatory-service/raw/master/resources/component.jpg
交互时序

https://github.com/alex2chen/compensatory-service/raw/master/resources/seq-new.jpg
数据模型

https://github.com/alex2chen/compensatory-service/raw/master/resources/table-design.jpg

内核实现
主要调研了2款开源组件,spring-retry和guava-retry,从实现上来看2款基本上都可以满足当下的需求。但最后还是选择spring-retry,为何没选择guava-retry呢?首先讲,它不是不好,而是功能特性太单一(10分钟就可以读懂源码)、多实例的实现(每个method都要一个Retryer),改造成本不小。
spring-retry源于spring-batch,功能非常强大,还有熔断机制,拓展性强,下面介绍它的一些组件:
RetryTemplate:包含execute,有没有种很熟悉的感觉,想想JdbcTemplate....
RetryListener: aop切中它包含的方法,就会执行它的监听
RetryConfiguration:定义了切面和通知,它包含AnnotationAwareRetryOperationsInterceptor
AnnotationAwareRetryOperationsInterceptor:它其实就是个MethodInterceptor①实现,它invoke主要构建RetryTemplate并执行execute,说起来简单。但它又稍微对其进行了封装,根据注解声明,可以利用StatelessRetryInterceptorBuilder、StatefulRetryInterceptorBuilder、StatelessRetryInterceptorBuilder生成不同MethodInterceptor②的目标执行方法。最后再强调①的职责解析retry注解,并生成对应的②的实例,②的职责是执行真实的调用,并执行retry(注:②未必一定要定义为MethodInterceptor,其实可以把它看做一种规约而非AOP实现)。
最后,我们的内核实现上,如果定制化高改造①,如果定制化不高可以①->③(新增个性化)->②
快速开始
配置介绍
包含注解的说明,回调Api的设计

可拓展实现
示例程序
————————————————
版权声明:本文为CSDN博主「布道」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alex_xfboy/article/details/82789590

原文地址:https://www.cnblogs.com/softidea/p/12325631.html

时间: 2024-08-01 03:19:38

如何一步步设计一款微服务的补偿方案的相关文章

《微服务设计》笔记-微服务集成推荐方案

为前端服务的后端 BFF(Backends For Frontends,为前端服务的后端)它允许团队在专注于给定UI的同时,也会处理与之相关的服务端组件.后端虽然嵌入在服务器,但它也是用户界面的组成部分.一些类型的UI只需要服务端的最小化足迹(footprint)即可,而其他一些可能需要的更多.API认证和授权层可以处在BFF和UI之间. 与第三方软件集成方案

Atitit.架构设计趋势 设计模式 ---微服务架构&#160;&#160;soa

Atitit.架构设计趋势 设计模式 ---微服务架构  soa 什么是微服务架构?1 .微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现1 微服务与康威定律2 微服务的一些设计 断路器 幂等2 <微服务设计>([英] 纽曼(Sam Newman))3 微服务架构与实践4 什么是微服务架构? Martin Fowler认为,微服务架构是一种独立部署的软件应用设计方式.这种架构方式没有准确的定义,但是在业务能力.自动部署.端对端的整合.对语言及数据的分散控制上有着共性.

架构设计之「 微服务入门 」

微服务这几年不可谓不火,很多技术团队都开始在自己的项目上引入了微服务.一方面这些团队确实很好的推动了微服务的应用和发展,另一方面也可以看到一些盲目追技术热点的行为所带来的危害,比如很多中小团队对微服务的基础知识只是做了很浅显的了解就开始盲目的推动微服务的实施,最后导致了项目的失败. 微服务要想做好是一个非常复杂的架构,今天就先只聊一聊微服务的一些基础架构,算是入门篇. 一.什么是「 微服务 」? 「 微服务 」由 Martin Fowler 提出,它是指一种软件架构风格.一个大型的系统可以由多个

想要设计自己的微服务?看这篇文章就对了

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由我就静静地看发表于云+社区专栏 本文通过使用Spring Boot,Spring Cloud和Docker构建的概念验证应用程序的示例,为了解常见的微服务架构模式提供了一个起点. 该代码在Github上可用,并且可以在Docker Hub上获得图像.只需一个命令即可启动整个系统. 作为这个系统的基础,我选择了一个旧项目,其后端曾经是一个整体.该应用程序提供了一种处理个人财务,组织收入和支出,管理储蓄,分析统计数据和创建简单预测的方

nodejs微服务健康检查方案

1. 前言 针对目前云平台方案,因为网络.主机状态等诸多因素,单台主机上的服务出现问题的几率大大增加.这就要求我们能够监控每台主机.每个微服务实例的健康状态.因此对于nodejs相关项目需要做相关的微服务健康检查接口. 在不改动原有express框架的基础上,我在express官方网站上查找到相应的健康检查的样例,做成demo供大家参考. (链接https://expressjs.com/en/advanced/healthcheck-graceful-shutdown.html) 2. 方案实

微服务高可用方案

一.微服务的高可用 在注册中心.配置中心高可用方案之前,了解一下注册中心的工作原理,下面分为两个部分来解释,一是注册中心和各个微服务的注册表的获取与同步,二是注册中心如何去维护注册表. 1.1.注册表的获取与同步 Eureka Server和Eureka Client之间的关系,通过注册表来维护,而注册表的通过Eureka Server集中化管理,每个Client在本地进行注册表的缓存,通过周期性的任务拉取最新的注册表信息.简单的示例图如下. 根据上图所展示的流程,可以了解到注册中心与微服务之间

微服务的4个设计原则和19个解决方案

转载本文需注明出处:微信公众号EAWorld,违者必究. 微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境. 本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更好的支撑企业应用架构. 微服务平台也是我目前正在参与的,还在研发过程中的平台产品,平台是以SpringCloud为基础,结合了普元多年来对企业应用的理

微服务开发中的数据架构设计

本文来自作者 陈伟荣 在 GitChat 分享的文章[微服务开发中的数据架构设计] 前言 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合.业务的灵活调整组合以及系统的高可用性.为业务创新和业务持续提供了一个良好的基础平台.本文分享在这种技术架构下的数据架构的设计思想以及设计要点,本文包括下面若干内容. 微服务技术框架中的多层数据架构设计 数据架构设计中的要点 要点1:数据易用性 要点2:主.副数据及数据解耦 要点3:分库分表

微服务设计原则与解决方案

本文转自:http://developer.51cto.com/art/201709/552085.htm 本文转自:https://www.cnblogs.com/stulzq/p/8573828.html 微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境.本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更