当前位置: 首页 > news >正文

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);
}

在这里插入图片描述

相关文章:

OpenSource - 分布式重试平台

文章目录 概述重试方案对比设计思想流量管理平台预览场景应用强通知场景发送MQ场景回调场景异步场景 概述 在当前广泛流行的分布式系统中,确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题,涌现了许多理论和业务实践,其…...

oracle稳定执行计划

二、稳定执行计划 (一)sql profile的好处 稳定执行计划 在不能修改目标sql的sql文本的情况下使目标sql语句按照指定的执行计划运行。 1、automatic类型的sql profile 本质是针对目标sql的一些额外的调整信息,这些额外的调整信息需要与原目标s…...

docker安装neo4j

参考文章: 1、Mac 本地以 docker 方式配置 neo4j_neo4j mac docker_Abandon_first的博客-CSDN博客 2、https://www.cnblogs.com/caoyusang/p/13610408.html 安装的时候,参考了以上文章。遇到了一些问题,记录下自己的安装过程: …...

第十五章 定义 HL7 的 DTL 数据转换

文章目录 第十五章 定义 HL7 的 DTL 数据转换 第十五章 定义 HL7 的 DTL 数据转换 每个接口可能需要一定数量的数据转换。创建转换时,不要使用保留的包名称。 重要提示:请勿在数据转换中手动更改 HL7 转义序列;自动处理这些。 可以使用“数…...

【笔记】移动光猫改桥接

1. 登录后台 移动光猫的超管和密码(百度的) 账号:CMCCAdmin 密码:aDm8H%MdA 浏览器访问 192.168.1.1 并登录 2. 选择连接 点击“网络”,在“连接名称”下拉框选择 INTENET_R_VID 字样的连接,并截图备…...

网络安全进阶学习第十四课——MSSQL注入

文章目录 一、MSsql数据库二、MSsql结构三、MSsql重点表1、master 数据库中的Sysdatabases 表2、Sysobjects 表3、Syscolumns 表 四、Mssql常用函数五、Mssql的报错注入六、Mssql的盲注常用以下函数进行盲注: 七、联合注入1、获取当前表的列数2、获取当前数据库名3、…...

【C语言】初阶结构体

🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:C语言初阶 ✨其他专栏:代码小游戏 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论…...

24届近5年南京理工大学自动化考研院校分析

今天学长给大家带来的是南京理工大学控制考研分析 满满干货~还不快快点赞收藏 一、南京理工大学 ​ 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学,学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院&#xf…...

5.PyCharm基础使用及快捷键

在前几篇文章中介绍了PyCharm的安装和汉化,本篇文章一起来看一下PyCharm的基本用法和一些快捷键的使用方法。 本篇文章PyCharm的版本为PyCharm2023.2 新建项目和运行 打开工具,在菜单中——文件——新建项目 选择项目的创建位置(注意最好不要使用中文路径和中文名项目名称…...

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本:otp_win64_23.2 rabbitmq-server-3.8.16 版本说明:https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…...

GPU版PyTorch对应安装教程

一、正确安装符合自己电脑的对应GPU版本的PyTorch之前需要了解三个基本概念 算力、CUDA driver version、CUDA runtime version ①算力:需要先知道你的显卡,之后根据官网表格进行对应,得到算力 ②CUDA driver version:电脑上显卡…...

医学影像PACS临床信息系统源码

医学影像临床信息系统(Picture Archiving and Communication Systems)PACS是指从医疗影像设备中获得数字影像,利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统,能实现影像数字化、无胶片化管理。 登记系统 …...

Python(Web时代)——jinja2模板

简介 Jinja2是Flask框架默认支持的模板引擎,是python的web项目中被广泛应用的一种模板引擎,jinja2的作者与Flask是同一个人。 jinja2具有以下特点: 非常灵活,提供了控制结构、表达式与继承等 性能好 可读性强 渲染一个模板&a…...

酷开系统 | 酷开科技,让数据变得更有价值!

身处信息时代,我们每个人时刻都在生成、传递和应用数据,数据已经成为了现代社会中宝贵的资源之一,而在人工智能领域,数据更是被称为人工智能的“燃料”。 而在AI的发展中,只有拥有高质量、多样性且充分代表性的数据集…...

uni——tab切换

案例展示 案例代码 <view class"tablist"><block v-for"(item,index) in tabList" :key"index"><view class"tabItem" :class"current item.id?active:" click"changeTab(item)">{{item.nam…...

类图的6种关系和golang应用

文章目录 1. 依赖和关联1.1 依赖&#xff08;Dependency&#xff09;概念类图示例代码示例 1.2 关联&#xff08;Association&#xff09;概念类图示例代码示例 2. 组合和聚合&#xff08;特殊的关联关系&#xff09;2.1 聚合&#xff08;Aggregation&#xff09;概念类图示例代…...

Linux tar 备忘清单

tar 备忘清单 语法选项创建一个 tar 格式的压缩文件创建压缩后的 tar.gz 存档文件生成压缩率更高的 tar.bz2 文件解压缩 tar 文件解压缩 tar.gz 文件解压缩 tar.bz2 文件列出归档内容从 tar 归档文件中提取单个文件从 tar 归档文件中提取多个文件使用通配符提取文件组添加文件或…...

76. 最小覆盖子串

题目链接&#xff1a;力扣 解题思路&#xff1a;滑动窗口 因为只需要最小子串中包含t中的所有字符即可&#xff0c;顺序不重要&#xff0c;所以可以先统计一下 t 中每个字符出现的次数&#xff0c;使用map进行统计&#xff1a; key表示t中的字符&#xff0c;value表示字符的个…...

科兴未来|2023“数智未来,聚放神采”医疗科技创新挑战赛

一、赛事亮点 聚焦前沿神经科学与脑科学领域 展示优质创新产品、技术、平台与服务 汇聚学术端、产业端、投资端多维专业视角 搭建合作交流、产业赋能与生态融合平台 共话行业发展方向与动态趋势 二、赛事简介 2023医疗科技创新挑战赛聚焦于神经科学及脑科学领域的前沿技…...

第56步 深度学习图像识别:CNN梯度权重类激活映射(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 类激活映射&#xff08;Class Activation Mapping&#xff0c;CAM&#xff09;和梯度权重类激活映射&#xff08;Gradient-weighted Class Activation Mapping&#xff0c;Grad-CAM&#xff09;是两种可视化深度学习模型决策过程的技术…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...