OpenSource - 分布式重试平台

news2024/11/24 15:45:30

文章目录

  • 概述
  • 重试方案对比
  • 设计思想
  • 流量管理平台预览
  • 场景应用
    • 强通知场景
      • 发送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";

    @Override
    public 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";

    @Override
    public 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.coloradmin.cn/o/846673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Idea全局搜索(ctrl+shift+F),搜索不全问题

今天idea突然出现,全局搜索,命名html文件中有这个字符,但是全局搜索居然匹配内容是空。。。。而且全局搜索界面也设置好了 经查发现是缓存问题,于是: 清空缓存后发现全局搜索功能可正常使用...

9.1网络通信基础

一.基础概念: 1)IP地址:描述网络上的一个设备所在的位置. 2)端口号(port):区分一个主机上不同的进程,和pid一样的作用,但两者不同. 3)协议:网络通信传输数据的含义,协议表示一种约定,这种约定可以是任意的.协议分层之后,上层不需要知道下层协议的细节,可以灵活地调整,替换某…

数字电路基础(MOS管)

1.PMOS和NMOS MOS晶体管的物理结构如下,由衬底和注入粒子的材质不同分为PMOS和NMOS。 2.CMOS CMOS由PMOS和NMOS组成,是一个反相器,其电路图如下所示。当In为1时,PMOS断开,NMOS导通,Out输出为0;…

探索ES高可用:滴滴自研跨数据中心复制技术详解

Elasticsearch 是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎,其每个字段均可被索引,且能够横向扩展至数以百计的服务器存储以及处理TB级的数据,其可以在极短的时间内存储、搜索和分析大量的数据。 滴滴ES发展至今&#xf…

Python实战之使用Python进行数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么? 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过算法,找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言,拥有丰富的数据挖掘库&#…

Java课题笔记~ AOP 概述

AOP 简介 AOP(Aspect Orient Programming)面向切面编程。 面向切面编程是从动态角度考虑程序运行过程。 AOP的底层,就是采用动态代理的方式实现的。 采用了两种代理:JDK动态代理、CGLIB动态代理。 JDK动态代理:使…

ElasticSearch 7.4学习记录(基础概念和基础操作)

若你之前从未了解过ES,本文将由浅入深的一步步带你理解ES,简单使用ES。作者本人就是此状态,通过学习和梳理,产出本文,已对ES有个全面的了解和想法,不仅将知识点梳理,也涉及到自己的理解&#xf…

聊聊springcloud如何与k8s configMap整合实现配置动态刷新

前言 配置中心在微服务的服务治理场景基本上是属于标配,常见可以用来做配置中心有nacos、apollo、zookeeper、springcloud config、consul、etcd、redis、disconf、dimond、xxl-conf等。这些组件的特点都是需要安装,如果大家的部署环境中有用到k8s&…

创意项目管理软件推荐:满足客户需求的完美解决方案

发现功能强大的工作管理软件,让创意大放异彩。将您团队的愿景变成引人注目的项目。 一、交付总是令人印象深刻的工作 Zoho Projects的创意项目管理软件可帮助您和您的团队在一个地方监督多个项目。使用我们的内置管理工具和模板,花更少的时间在管理上&a…

Verilator仿真环境搭建

Verilator简介与使用_Hwang_shuo的博客-CSDN博客 Verilator是一种开源的Verilog/SystemVerilog仿真器,可用于编译代码以及代码在线检查,Verilator能够读取Verilog或者SystemVerilog文件,并进行lint checks(基于lint工具的语法检测)&#xff…

第六章:Linux基础IO

系列文章目录 文章目录 系列文章目录前言打开文件预备知识回顾C文件IO操作C语言I/O库函数fopen/fcloseperrorfwrite/freadfgets/fputsprintf/fprintf/sprintf/snprintfstdin/stdout/stderr 标志位系统调用IO接口open/closeumaskwrite/read lseek库函数IO操作与系统调用IO操作比…

ubuntu 20.0.4 搭建nvidia 显卡环境

一、安装docker 1、安装dokcer sudo apt install docker.io2、docker 添加到用户组 创建docker用户组 sudo groupadd docker添加当前用户加入docker用户组 sudo usermod -aG docker ${USER}重启docker服务 sudo systemctl restart docker切换或者退出当前账户再从新登入 …

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led,用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

【计算机网络】第四章 IPv4

文章目录 4.3 IPv44.3.1 IPv4 地址概述4.3.2 分类编址的 IPv4 地址 4.3 IPv4 IPv4是互联网协议第四版(Internet Protocol version 4)的简称。它是现今互联网最常用的网络层协议,为互联网上的设备提供了唯一的逻辑地址,用于在网络…

【电机绘图】:插补算法(一)—直线插补—逐点比较法

今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 : 插补算法 本文提供直线插补的概念基础,基本思路分析,C语言实现等,代码会直接贴出! 插补算法是指在数值计算或数据处理中,根据已有的数据…

Windows环境利用QT+CMake编译mingw版本的opencv

Opencv官网没有提供mingw版本的opencv库,所以需要自己编译,下面是编译过程,32位64位方法类似。 可以直接下载编译好的mingw版本opencv4.4: 使用CMAKE3.22QT5.13编译后的opencv4.4(32位的)资源-CSDN文库 …

【win10专业版远程控制】 自带远程桌面公司内网电脑

使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中,各类电子硬件已经遍布我们身边,除了应用在个人娱乐场景的消费类电子产品外,各项工作也离不开电脑的帮助,特别是涉及到数…

Nginx环境搭建、docker安装

1.Nginx安装 1)首先创建Nginx的目录并进入 [rootlucky ~]# mkdir /soft && mkdir /soft/nginx/ [rootlucky ~]# cd /soft/nginx/ [rootlucky nginx]# 2)下载Nginx的安装包,可以通过FTP工具上传离线环境包,也可通过wget命…

数据标注对新零售的意义及人工智能在新零售领域的应用?

数据标签对于新零售至关重要,因为它构成了训练和部署人工智能(AI)和机器学习(ML)模型的基础。在新零售的背景下,数据标签涉及对数据进行分类、标记或注释以使其能够被机器理解的过程。然后,这些…