关于分布式项目的补偿机制(案例总结)

news2024/11/23 7:46:39

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…


一、业务场景

在这里插入图片描述

给大家整理一下最近遇到的项目问题: A服务生成数据后推送给B服务,此时B服务挂掉,后续如何解决

调用
A服务
B服务

先说一下我的解决思路,因为我们项目没有用到分布式事务,所以就用补偿机制和手动回滚数据来解决分享思路交流经验


二、补偿解决

1.创建一个数据表记录推送失败的数据
2.创建一个定时任务隔一段时间后重推数据到B系统

记录表里对应的数据会有一个标识号,如果数据成功推送或者补偿成功,修改此标识符合,数据不会重复推送

我这里说的是创建MySQL表来实现对应的补偿。同时还有很多其余的补偿方法

例如

重试机制:A服务可以设计一个重试机制,在B服务挂掉后,定期尝试重新推送数据。如果在一定时间内B服务重启,并能够恢复接收数据,A服务就可以将数据成功推送给B服务。

存储数据:A服务可以将生成的数据暂时存储在一个数据存储系统中(如Redis、Kafka),等待B服务重新恢复后,再从存储系统中读取数据并推送给B服务。

下面是一个简单的定时任务推送案例的Java代码:

import java.util.*;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class OrderTask {
    
    @Autowired
    private RestTemplate restTemplate;
    
    // 定义推送订单信息的方法
    private void pushOrderInfo(OrderInfo orderInfo) {
        String url = "http://logistics-service/push_order_info";
        try {
            String response = restTemplate.postForObject(url, orderInfo, String.class);
            System.out.println("订单信息已成功推送!响应内容为:" + response);
        } catch (Exception e) {
            System.out.println("订单信息推送失败,错误信息为:" + e.getMessage());
        }
    }
    
    // 定时任务:检查未处理的订单信息并重新推送给物流服务
    @Scheduled(fixedRate = 10000) // 每10秒钟执行一次
    private void checkUnprocessedOrders() {
        // 查询未处理的订单信息
        List<OrderInfo> unprocessedOrders = getUnprocessedOrders();
        // 遍历未处理的订单信息,并重新推送给物流服务
        for (OrderInfo order : unprocessedOrders) {
            pushOrderInfo(order);
        }
    }
    
    // 查询未处理的订单信息(这个方法的具体实现可以根据实际情况而定)
    private List<OrderInfo> getUnprocessedOrders() {
        // TODO: 查询未处理的订单信息
        return new ArrayList<>();
    }

}

其中,pushOrderInfo()方法用于将订单信息推送给物流服务,checkUnprocessedOrders()方法则用于定时查询未被处理的订单信息,并重新推送给物流服务。在OrderTask类上,使用了Spring的@Component注解,表示这是一个组件类,可以被Spring容器扫描到并实例化。使用了Spring的@Autowired注解,表示需要注入RestTemplate对象,用于发送HTTP请求。在checkUnprocessedOrders()方法上,使用了Spring的@Scheduled注解,表示这是一个定时任务,可以定期执行指定的方法。这里设置了fixedRate属性为10000,表示每隔10秒钟执行一次。在实际使用中,可以根据具体需求来设置定时任务的执行频率。


三、数据一致性保障

调用
A服务
B服务

我们再回到最初的业务问题,如果A生成100个单据,推送给B,此时B服务挂掉,此时A系统上已经有对应的100个单据数据了,此时两个系统数据不同步,如果对A系统单据提交或者取消操作会出现系统异常等错误。

在这里插入图片描述

解决办法:A系统生成100个单据,A推送B失败,检查代码里面是否做了事务回滚,如果不能回滚,手动方法补偿删除A生成的100个单据。如上方法在异常里面执行即可。执行结束后我们可以发邮件或者钉钉通知的方法告诉 系统开发人员此处 推送数据失败等。开发或者运营 再进行人为的检查排查问题。

说明:这样的好处就是不会让错误的数据出现在系统中。保障了数据的一次性。

弊端:不同于如上的定时任务补偿,没有做到很智能化,要新增人力来排查问题。如服务挂掉后,此方案还要人力重新推送。定时任务则实现了直接推送数据。

对比定时任务:如果是因为服务挂掉。定时任务的弊端在于可能在短暂的时间内会造成两个系统数据不一致的问题。


四、总结学习

分布式项目的补偿机制是指在分布式系统中,当出现数据传输错误、节点宕机等意外情况时,通过一定的方法修复或补偿数据损失,保证系统的稳定性和可靠性。

一般来说,分布式项目的补偿机制主要分为以下几个方面:

  1. 重试机制:当某个节点出现错误时,可以通过多次重试来尝试重新发送数据,直到成功为止。

  2. 异常捕获机制:通过捕获异常信息,及时发现和处理错误,避免错误的传播和扩大化。

  3. 数据备份机制:在分布式系统中,进行数据备份是非常重要的,可以通过多个节点进行数据备份,保证在某个节点出现故障时,数据可以从备份节点中恢复。

  4. 数据一致性机制:在分布式系统中,保证数据一致性是非常关键的,可以通过分布式一致性算法(如Paxos、Raft)来保证数据的一致性和可靠性。

  5. 事务回滚机制:当某些操作出现错误时,可以通过事务回滚机制将数据恢复到操作前的状态,保证数据的准确性和完整性。

总之,分布式项目的补偿机制需要结合具体的情况和业务需求进行选择和设计,才能真正保证系统的可靠性和稳定性。


📖☕️🌊📝📚🎩🚀
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

📚愿我们奔赴在各自的热爱里!

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

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

相关文章

走近人工智能|NLP的语言革命

前言&#xff1a; 自然语言处理&#xff08;NLP&#xff09;是指使用计算机处理和理解人类语言的技术。 文章目录 自然语言序言背景适用领域技术支持应用领域程序员如何学总结 自然语言 序言 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09…

scratch绘制多彩五角星 中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析2023年5月

目录 scratch绘制多彩五角星 一、题目要求 1、准备工作 2、功能实现 二、案例分析

口琴试试看

自己的第一把口琴 给初学者入门的口琴推荐指南&#xff0c;选购口琴不再困难&#xff08;2023.2更新&#xff09; 初学者入门口琴选购 (复音/半音阶/布鲁斯十孔口琴推荐&#xff09; 推荐半音&#xff1a;三种类型的口琴&#xff0c;该学哪一种&#xff1f;十孔口琴低音还面…

Android系统的Ashmem匿名共享内存子系统分析(2)- 运行时库cutils的Ashmem访问接口

声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法&#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的&#xff0c;但因为我个人问题没能实施这个计划&#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容&#xff0c;可能涉及的比较…

带领你打开C++的神秘之门--完结篇

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

【耗时一月】AWS Aurora 数据库 Failover 处理方案

Aurora简述 Amazon Aurora 是亚马逊自研的云原生数据库&#xff0c;除兼容性、性能、扩展性外&#xff0c;它在设计之初&#xff0c;就以极致的可用性作为目标&#xff0c;尽可能减少故障对应用程序的影响。 Amazon Aurora 在故障恢复方面的设计理念主要包括&#xff1a; 1. 能…

Lecture 11 Contextual Representation

目录 Problems with Word Vectors/Embeddings 词向量/嵌入的问题RNN 语言模型Bidirectional RNN 双向 RNNEmbeddings from Language Models 基于语言模型的嵌入ELMo 架构Downstream Task: POS Tagging 下游任务&#xff1a;词性标注ELMo 的表现如何&#xff1f;Other Findings上…

Word控件Spire.Doc 【其他】教程(7): 使用象征符号在 Word 中绘制复选框

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

河北沃克HEGERLS仓储货架生产厂家|夹抱式伸缩货叉四向穿梭车新型物流机器人

众所周知仓库作业主要是围绕存取、搬运、拣选、输送分拣而进行的&#xff0c;而随着物流作业的多样化、复杂化&#xff0c;四向穿梭车作为新的存储技术&#xff0c;以其灵活、柔性等特点而备受瞩目。河北沃克在成功研发四向穿梭车的基础上又对其进行了产品的横向发展。目前&…

为什么会有刷掉第一名、刷掉400+的院校?

本期为大家整理热门院校-“南昌大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研招网…

数据库信息速递 10年的数据库使用习惯变革,数据库的使用习惯在被改变 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

苹果的头显,只要看一眼就行

阅读本文大概需要 1.66 分钟。 今年的 WWDC23 开发者大会&#xff0c;不少人表示 iOS 更新了个寂寞&#xff0c;但 Vision Pro 头显却意外吸引眼球&#xff0c;看来苹果工程师都忙着搞头显去了。 苹果的头显终于还是来了&#xff0c;关于它的传闻&#xff0c;似乎这几年从未间断…

【立体视觉(一)】之成像原理与镜头畸变

【立体视觉&#xff08;一&#xff09;】之成像原理与镜头畸变 一、成像原理一&#xff09;针孔模型二&#xff09;坐标系转换1. 世界坐标系到相机坐标系2. 相机坐标系到图像坐标系3. 图像坐标系到像素坐标系4. 相机坐标系到像素坐标系5. 世界坐标系到像素坐标系 二、镜头畸变一…

数据结构 | 图的遍历(C语言)

一、数据结构定义 1、图 #define MaxVertexNum 100 // 最大可存储的节点数目/*图*/ typedef char VexterType; typedef int EdgeType;typedef struct GraphMatrix {VexterType Vexs[MaxVertexNum]; //结点 EdgeType Edges[MaxVertexNum][MaxVertexNum]; //边int vexnum, a…

【区块链】以太坊L2扩容方案与零知识证明

以太坊L2扩容方案与零知识证明 简介 简要概述以太坊L2层现有解决方案简要概述以太坊L2未来扩容的方向简要概述零知识证明的基本概念和零知识证明在以太坊的运用简要概述stark ware的两个产品&#xff0c;但并不推荐现有使用和研究简要概述polygon zkEVM&#xff0c;推荐使用和…

纷享销客斩获“2022-2023年度用户推荐SaaS品牌”

近日&#xff0c;纷享销客受邀出席CSIC2023第八届SaaS应用大会暨云领奖颁奖典礼活动。纷享销客作为国内领先的CRM 云厂商&#xff0c;凭借产品创新以及强大的行业解决方案能力&#xff0c;以绝对实力荣获“2022-2023年度用户推荐SaaS品牌”。 据悉&#xff0c; C SIC云领奖自 …

【SQL武林秘籍】玩转表及其数据

目录 &#x1f4d6;前言 &#x1f600;数据库约束类型 1️⃣not null 非空约束 2️⃣unique 唯一约束 3️⃣default 默认值约束 4️⃣primary key 主键约束 5️⃣foreign key 外键约束 6️⃣check 限制约束 &#x1f609;新增(insert select) &#x1f604;查询(进…

Podman 是 Docker 的直接替代品吗?

在许多地方&#xff0c;你可以读到Podman是Docker的替代品。但是&#xff0c;真的像听起来那么简单吗&#xff1f;在这篇文章中&#xff0c;你将从一个可以立即投入生产使用的Dockerfile开始&#xff0c;并执行Podman命令&#xff0c;就像你使用Docker时会做的那样。让我们看看…

【Vite环境变量】import.meta.env 和 loadEnv使用和区别

前言 我们在做项目时需要各种配置信息&#xff08;如应用标题、API 地址等&#xff09;&#xff0c;这些配置信息可能在不同环境下有所不同&#xff08;如开发环境和生产环境&#xff09;。 如果每次更改开发或者更改生产环境需要修改源代码中的相关配置&#xff0c;这会导致…

老生常谈:接口幂等性,防止并发插入重复数据

分布式系统中&#xff0c;接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。不知道你有没有遇到过这些场景&#xff1a; 有时我们在填写某些form表单时&#xff0c;保存按钮不小心快速点了两次&#xff0c;表中竟然产生了两条重复的数据&a…