OpenSource - 分布式重试平台

文章目录

  • 概述
  • 重试方案对比
  • 设计思想
  • 流量管理平台预览
  • 场景应用
    • 强通知场景
      • 发送MQ场景
      • 回调场景
      • 异步场景

在这里插入图片描述


概述

在当前广泛流行的分布式系统中,确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题,涌现了许多理论和业务实践,其中BASE理论是目前业界广泛接受的分布式一致性理论。

基于BASE理论,采用柔性事务并优先保障系统的可用性和数据的最终一致性已逐渐成为技术共识。 为了确保分布式服务的可用性和数据一致性,并防止由于网络抖动、连接超时等问题导致短时不可用的情况,根据"墨菲定律",在核心流程中增加重试和数据核对校验的动作成为提高系统鲁棒性常用的技术方案。

在此背景下EasyRetry应运而生。EasyRetry是一款基于BASE思想实现的分布式服务重试组件,旨在通过重试机制确保数据的最终一致性。它提供了控制台任务观测、可配置的重试策略、重试后执行回调以及丰富地告警配置等功能。

通过这些手段,可以对异常数据进行全面监测和回放,从而在确保系统高可用性的同时,大大提升数据的一致性。

在这里插入图片描述

通常的业务场景有:

  • 保障系统稳定性,减少网络抖动导致异常,增加重试能力
  • 保障服务容错性,对核心流程进行拆分,在业务低峰期进行数据核对
  • 保证信息的可达性,在服务间通知时增加重试

但由于正常业务场景较难触发重试流程,从而导致研发测试对重试场景和流量并不重视,始终处于重要但无序的"管理真空"

Easy-RETRY 是一个针对业务系统重试流量的治理平台,其自身具有高可用高性能高负载的特点,服务特性有:

  • 支持千万级别的重试流量分派
  • 支持流量容量扩容,自动识别并处理
  • 支持流量处理节点水平扩容
  • 高效利用系统资源支持高并发
  • 支持多种算法调度客户端执行
  • 打包上报,支持高并发业务场景
  • 加密通讯,保障信息安全

在这里插入图片描述


重试方案对比

在这里插入图片描述

设计思想

在这里插入图片描述

流量管理平台预览

地址: http://preview.easyretry.com/ 账号: admin 密码: admin

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


场景应用

为了小伙伴们能更快了解EasyRetry的使用场景和优势,以下新增了一些模拟案例仅供大家参考。 同时期待大家积极参与并分享自己在项目中使用EasyRetry的经验和案例,共同推动技术的发展和应用的实践。

这样可以让更多需要使用EasyRetry的小伙伴们找到适合自己的应用场景, 并充分利用EasyRetry的优势,以提升系统的可靠性和稳定性。

强通知场景

强通知性

在某些业务场景下,需要强制保证将通知、消息等数据发送到目标端接口,但由于网络的不确定性以及目标系统、应用、服务的不确定性,可能会造成通知消息的发送失败。

此类场景下可以使用LOCAL_REMOTE或者ONLY_REMOTE模式进行重试。


发送MQ场景

众所周知消息队列的异步、削峰、解耦优点, 在业务系统承担着十分重要的角色,如果保障消息的可达性就尤为重要了。

下面模拟一个常见的的下单流程。

在这里插入图片描述
订单中心下单完成后回抛出下单成功消息从而解耦了订单和其他业务系统的耦合关系,其他相关的业务系统只需要监听订单的下单成功的消息即可完成自己的业务逻辑。

但是若由于网络的不稳定、消息队列故障等等,可能导致消息未发送出去,这时候就需要增加重试流程来保障消息的强可达性

在这里插入图片描述
然后接入EasyRetry后将变的非常简单,您只需要简单的一个注解就保障强可达性

以下代码案例仅供参考

@Retryable(scene = "create-order-success", retryStrategy = RetryType.ONLY_REMOTE)
public void sendCreateOrderSuccessMessage(Message message) {......// 发送消息mqProducer.publish("主题", "key", message);
}

如果您不想使用注解的方式您可是使用手动模式

public void createOrder(Order order) {// 其他逻辑// 发送消息try {mqProducer.publish("主题", "key", order);} catch (Exception e) {// 发送出现异常EasyRetryTemplate retryTemplate = RetryTaskTemplateBuilder.newBuilder().withExecutorMethod(RetrySendMqMessageExecutorMethod.class).withParam(order).withScene(RetrySendMqMessageExecutorMethod.SCENE).build();retryTemplate.executeRetry();}
}
@ExecutorMethodRegister(scene = RetrySendMqMessageExecutorMethod.SCENE, async = true, forceReport = true)
public class RetrySendMqMessageExecutorMethod implements ExecutorMethod {public static final String SCENE = "retrySendMqMessageExecutorMethod";@Overridepublic Object doExecute(Object objs) {Object[] params = (Object[]) objs;// 发送消息mqProducer.publish("主题", "key", params[0]);return null;}
}    

回调场景

这里引用一个使用EasyRetry的小伙伴重试框架-Easy-Retry接入之路,他们线上真实的使用场景。

他们一个paas平台, 其中功能模块有“事件中心”,“审核中心”,“支付中心”等相关的一些组件。他们都有一个类似的东西,当我发起事件的时候,需要将事件通知到其他的应用, 比如

  • 【审核中心】当我审核的时候需要将审核结果返回给其他应用,
  • 【支付中心】当我支付完成后也会将结果推送给其他应用。

然而,我们的其他应用可能会有不可用的状态, 可能会导致回调通知的时候会报错, 所以不难想象到我们需要做一个重试机制来保障回调的可达性

下面是一个支付中心的调用过程

在这里插入图片描述

用户在商品中心下单然后通过支付中心唤起收银台进行付款,第三方支付平台回调支付中心,支付平台回调商品中心完成业务流程;

但是若回调失败了就会导致商品中心和 支付中心数据不一致,这肯定不是我们所期望的。

所以需要新增一个重试机制来保障数据的最终一致性。

以下代码案例仅供参考

@Retryable(scene = "callbackProductCenter", retryStrategy = RetryType.ONLY_REMOTE)
public void callbackProductCenter(CallbackDTO callback) {......// 回调商品中心String responseStr = restTemplate.postForObject("第三方接口", "参数", String.class);
}

如果您不想使用注解的方式您可是使用手动模式

public void callbackProductCenter(CallbackDTO callback) {// 其他逻辑try {// 回调商品中心String responseStr = restTemplate.postForObject("第三方接口", "参数", String.class);} catch (Exception e) {// 发送出现异常EasyRetryTemplate retryTemplate = RetryTaskTemplateBuilder.newBuilder().withExecutorMethod(RetrySendMqMessageExecutorMethod.class).withParam(order).withScene(RetrySendMqMessageExecutorMethod.SCENE).build();retryTemplate.executeRetry();}
}
@ExecutorMethodRegister(scene = CallbackProductCenterExecutorMethod.SCENE, async = true, forceReport = true)
public class CallbackProductCenterExecutorMethod implements ExecutorMethod {public static final String SCENE = "callbackProductCenterExecutorMethod";@Overridepublic Object doExecute(Object objs) {Object[] params = (Object[]) objs;// 回调商品中心String responseStr = restTemplate.postForObject("第三方接口", "参数", String.class);return null;}
}    

异步场景

在一些核心的接口上,我们总是想不断的提高接口的性能,我们知道提高接口性能的方式常用的就是异步、缓存、并行等,

这里我们说说异步,比如下面一个场景
在这里插入图片描述

下单完成后会有一些非核心的流程,主要特点实时性要求不高、耗时比较高的操作等;

一般会把这些流程进行异步化操作、进程异步化: 比如可以通过发送MQ消息, 如果保存MQ的可达性可以参考发送MQ场景⬆️⬆️⬆️

线程异步化: 开启一个异步线程进行异步处理, 但是出现异常就会导致数据丢失,因此需要增加重试保证数据的一致性, 可以使用LOCAL_REMOTE先本地重试,如果本地重试仍未解决就上报服务端

以下代码案例仅供参考

@Retryable(scene = "sendEmail", retryStrategy = RetryType.LOCAL_REMOTE)
public void sendEmail(EmailDTO email) {......// 发送下单确认邮件String responseStr = restTemplate.postForObject("邮箱地址", email, String.class);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/75903.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】数据可视化利器PyCharts在测试工作中的应用

目录 PyCharts 简介 PyCharts 的安装 缺陷统计 测试用例执行情况 使用JavaScript情况 缺陷趋势分析 将两张图放在一个组合里(grid) 将两张图重叠成一张图(overlap) 将多张图组合在一个page 中(page&#xff0…

马斯克收购AI.com域名巩固xAI公司地位;如何评估大型语言模型的性能

🦉 AI新闻 🚀 AI拍照小程序妙鸭相机上线商业工作站并邀请摄影师进行内测 摘要:AI拍照小程序妙鸭相机将上线面向商业端的工作站,并邀请摄影师进行模板设计的内测。妙鸭相机希望为行业提供更多生态产品,扩大行业规模&a…

探究Spring事务:了解失效场景及应对策略

在现代软件开发中,数据的一致性和完整性是至关重要的。为了保证这些特性,Spring框架提供了强大的事务管理机制,让开发者能够更加自信地处理数据库操作。然而,事务并非银弹,存在一些失效的情景,本文将带您深…

坚鹏:中国邮储银行金融科技前沿技术发展与应用场景第2期培训

中国邮政储蓄银行金融科技前沿技术发展与应用场景第2期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力,是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市,2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

Flink之JDBC Sink

这里介绍一下Flink Sink中jdbc sink的使用方法,以mysql为例,这里代码分为两种,事务和非事务 非事务代码 import org.apache.flink.connector.jdbc.JdbcConnectionOptions; import org.apache.flink.connector.jdbc.JdbcExecutionOptions; import org.apache.flink.connector.…

wireshark简单使用(一)

前两天为同事处理交换机故障,接触到wireshark使用,意识到这个工具对于工程师来说,查询报文还是必须的,了解基本的使用。 于是接触到一些视频,开始自学。 第一步 查询本机IP地址 cmd---ipconfig 查看本机IP地址和网关…

【CI/CD】图解六种分支管理模型

图解六种分支管理模型 任何一家公司乃至于一个小组织,只要有写代码的地方,就有代码版本管理的主场,初入职场,总会遇到第一个拦路虎 git 管理流程,但是每一个企业似乎都有自己的 git 管理流程,倘若我们能掌握…

学习购药系统源码:从前端到后端的技术探索

本文将带领读者探索购药系统源码,从前端到后端逐步深入,了解其核心功能和实现方式。我们将使用常见的Web技术,包括HTML、CSS、JavaScript、以及Python的Django框架,展示购药系统的技术奥秘。 前端技术探索 HTML结构搭建 购药系…

京东开源的、高效的企业级表格可视化搭建解决方案:DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…

Jmeter(一) - 从入门到精通 - 环境搭建(详解教程)

1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器…

【蓝图】p48冲刺、瞬移、多段跳

p48冲刺,瞬移,多段跳 p48冲刺,瞬移,多段跳冲刺功能实现瞬移功能实现Set Actor Location(设置Actor位置) 二段跳 p48冲刺,瞬移,多段跳 按shift加速,松开shift恢复普通速度…

swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)

我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样 这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适…

在word的文本框内使用Endnote引用文献,如何保证引文编号按照上下文排序

问题 如下图所示,我在word中插入了一个文本框(为了插图),然后文本框内有引用,结果endnote自动将文本框内的引用优先排序,变成文献[1]了,而事实上应该是[31]。请问如何能让文本框内的排序也自动…

8.4 作业

1.思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash count10 count20 cd ~ for i in $(ls) doif [ -f "$i" ]thencount1$((count11))elif [ -d "$i" ]then count2$((count21))fi done echo $count1 echo $count2 3.输入一…

Java阶段五Day17

Java阶段五Day17 文章目录 Java阶段五Day17师傅后台功能师傅审核列表相关功能启动进程和启动方式 后台审核详情查询查询审核详情流程远程调用图片服务 缓存逻辑缓存逻辑流程查询引入缓存流程完成缓存逻辑面试题整理 附录redis分布式——架构演变 师傅后台功能 师傅审核列表 相…

aws中opensearch 日志通(Centralized Logging with OpenSearch)2.0(一)

aws日志通2.0 实现全面的日志管理和分析功能 一体化日志摄取 :把aws服务器日志和应用日志传输到opensearch域中无代码日志处理 :在网页控制台中就可以实现数据处理开箱即用 :提供可视化模版(nginx、HTTP server ) 架构…

【Docker】Docker容器化技术基础

Docker容器化技术 Docker(软件跨环境迁移)Docker概念:安装Dockerdocker架构配置Docker镜像加速器 一、Docker命令服务daemon相关的命令镜像相关命令Docker容器相关命令 二、Docker容器的数据卷数据卷概念配置数据卷配置数据卷容器 三、Docker…

苍穹外卖day10——订单状态定时处理(Spring Task)、来单提醒和客户催单(WebSocket)

预期效果 对于超时没处理的需要定时程序处理。基于SpringTask实现。 来单提醒和客户催单。基于WebSocket实现。 Spring Task 介绍 Cron表达式 周几通常不能和日一起指定。 cron表达式在线生成器 在线Cron表达式生成器 入门案例 创建定时任务类 /*** 定义定时任务类*/ Slf4j…

你知道HTTP与HTTPS有什么区别吗?

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、什么是HTTP? 二、什么是HTTPS? 三、HTTPS 的工作原理 1、客户端发起 HTTPS 请求 2、服务端的配置 3、…

为什么Java不支持多继承?

面试回答 因为如何要实现多继承,就会像C中一样,存在菱形继承的问题,C为了解决菱形继承问题,又引入了虚继承。因为支持多继承,引入了菱形继承问题,又因为要解决菱形继承问题,引入了虚继承。而经过分析&#…