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

软件工程中数据一致性的探讨

软件工程中数据一致性的探讨

  • 引言
  • 数据一致性:软件工程中的业务正确性与性能的权衡
  • 数据一致性为何重要
    • 业务正确性:事务的原子性与一致性
    • ACID原则的基石
    • 分布式事务的挑战
    • 一致性级别:从强一致到最终一致
  • 实践中的一致性权衡
    • 金融系统:强一致优先
    • 社交网络:最终一致优先
    • 电商系统:混合策略
  • 现代分布式系统的创新方案
    • Google Spanner:全球强一致
    • 事件溯源(Event Sourcing)
    • 共识算法的演进
  • 总结与建议

引言

软件工程中,常常涉及数据一致性这个概念。刚接触这个概念的时候,脑中的最初理解就是“两个对象/数据保持一样,或者一个对象/数据前后要保持一样”。

带着这样的理解来认识关系型数据库事务四大特性ACID中的"C": 指事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。便有不知所云之感。

随着工作经验的累积,渐渐对数据一致性产生了两个方面的理解:
一是业务正确性,例如甲向乙转账100,甲的账户必须减少100,乙的账户必须增加100,保证数据的一致,也就是业务正确性(业务完整性),这一点是基于事务的原子性的。
二是强一致和弱一致性,如果甲向乙转账100,乙在极端时间间隔内收到,这是强一致性,时间间隔越短,强度越大。时间间隔越大,强度越低,便是弱一致性。
关系型数据库中的ACID的一致性应该指的是强一致性。

根据以上理解,结合AI和网络进一步细化并补充一些关键概念,结合真实案例和现代分布式系统设计,探讨数据一致性的核心逻辑、技术实现及实践权衡。


数据一致性:软件工程中的业务正确性与性能的权衡

在数字化时代,数据是系统的血液。无论是银行转账、电商购物,还是社交媒体的点赞互动,每一次操作背后都是数据在流动。然而,数据流动并非总是一帆风顺——数据一致性问题就像暗流,若处理不当,轻则用户体验受损,重则引发资金损失甚至法律纠纷。


数据一致性为何重要

想象这样一个场景:用户A向用户B转账100元,系统提示“转账成功”,但用户B的账户余额并未变化。此时用户A的信任会瞬间崩塌,而系统背后的技术团队可能需要通宵排查问题。

这类问题的本质是数据一致性的缺失:

  1. 业务正确性:转账操作必须保证A扣款和B收款同时生效(原子性),且总金额守恒(一致性)。
  2. 一致性级别:用户是否需要“立即”看到结果(强一致性),还是允许短暂延迟(弱一致性)。

业务正确性:事务的原子性与一致性

ACID原则的基石

在单机数据库中,事务通过ACID特性保证业务正确性:

  • 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败(例如转账的扣款和收款必须同时生效)。
  • 一致性(Consistency):事务执行后,数据必须满足预定义的业务规则(例如转账后总金额不变)。

代码示例(MySQL事务):

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B';
COMMIT;

如果执行过程中发生错误(如A余额不足),事务将回滚(ROLLBACK),保证原子性。

分布式事务的挑战

在微服务架构中,扣款服务和收款服务可能属于不同的数据库,传统单机事务不再适用。此时需引入分布式事务方案:

  • 2PC(两阶段提交):协调者(Coordinator)分两阶段询问参与者(Participant)是否可提交,全部同意后提交。
    缺点:同步阻塞、协调者单点故障。
  • Saga模式:将事务拆分为多个本地事务,通过补偿操作回滚(例如先扣款,失败后调用补偿接口退款)。
  • TCC(Try-Confirm-Cancel):分三阶段实现(Try预留资源,Confirm提交,Cancel释放资源)。

适用场景:

  • 2PC适合一致性要求极高的金融场景(如银行核心系统)。
  • Saga适合长事务(如电商订单的创建、支付、物流)。

一致性级别:从强一致到最终一致

  1. 强一致性(Strong Consistency)
    定义:写入后,所有后续读操作都能立即读到最新值。
    实现技术:
  • 同步复制:主库写入后需等待所有从库确认(如ZooKeeper)。
  • 分布式锁:通过Redis RedLock或etcd保证全局互斥访问。

代价:

  • 高延迟:跨节点同步增加响应时间。
  • 低可用性:网络分区时可能无法写入(CAP定理中的CP系统)。

案例:

  • 支付宝余额变动需强一致,用户无法接受余额更新延迟,12306购票时库存扣减必须强一致,避免超卖。
  1. 最终一致性/弱一致性(Eventual Consistency/Weak Consistency)
    定义:允许数据在一段时间内不一致,但最终趋于一致。
    常见子类型:
  • 读写一致性(Read-Your-Writes):用户能立即读到自己的写入(如朋友圈发帖后自己可见)。
  • 因果一致性(Causal Consistency):有因果关系的事件需按顺序可见(如先发帖后评论)。

实现技术:

  • 异步复制:主库写入后异步同步到从库(如MySQL Binlog)。
  • 冲突解决:使用CRDT(无冲突复制数据类型)或时间戳合并冲突。

代价:

  • 短暂不一致:用户可能看到旧数据(如商品详情页的库存显示)(CAP定理中的AP系统)。

案例:

  • 微博的点赞数统计允许短暂不一致,优先保障高并发性能。
  • 电商商品详情页的浏览量统计通常采用最终一致。

实践中的一致性权衡

金融系统:强一致优先

  • 需求:转账、支付等操作必须实时一致。
  • 技术方案:
    • 基于Raft/Paxos的分布式数据库(如TiDB)。
    • 使用TCC模式实现跨服务事务。

社交网络:最终一致优先

  • 需求:点赞、评论等操作可容忍短暂延迟。
  • 技术方案:
    • Redis缓存计数,异步批量落库。
    • 消息队列(如Kafka)解耦写入与处理逻辑。

电商系统:混合策略

  • 核心数据强一致:订单状态、支付结果。
  • 非核心数据最终一致:商品浏览量、用户行为日志。

现代分布式系统的创新方案

Google Spanner:全球强一致

  • 核心技术:
    • 通过原子钟和GPS实现TrueTime API,精确同步全球节点时间。
    • 基于Paxos协议实现跨地域数据复制。

事件溯源(Event Sourcing)

  • 核心思想:记录事件流(如“用户A转账100元给用户B”),而非最终状态。
  • 架构实现:
    • 使用Kafka存储事件流。
    • 通过CQRS(命令查询职责分离)重建数据视图。
      适用场景:审计追踪、对账系统(如区块链交易记录)。

共识算法的演进

  • Raft:以易理解性著称,用于etcd、Consul等系统。
  • Paxos:理论完备但实现复杂,是分布式一致性的理论基础。

总结与建议

数据一致性是系统设计的永恒课题:

  1. 正确性优先:金融、政务等场景必须强一致,通过分布式事务和共识算法保障。
  2. 性能优先:高并发场景(如社交、电商)可接受最终一致,通过异步化和缓存提升吞吐。
  3. 兜底机制:监控、日志审计、定期对账是最后防线。

开发中需要考虑:

  • 在需求阶段明确一致性要求(SLA)。
  • 避免过度设计,优先满足业务核心需求。
  • 通过混沌工程(Chaos Engineering)测试系统的一致性容错能力。

在技术的天平上,数据一致性是砝码,而业务需求是刻度。唯有理解其本质,方能在正确性与性能的博弈中找到最优解。

愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

相关文章:

软件工程中数据一致性的探讨

软件工程中数据一致性的探讨 引言数据一致性:软件工程中的业务正确性与性能的权衡数据一致性为何重要业务正确性:事务的原子性与一致性ACID原则的基石分布式事务的挑战一致性级别:从强一致到最终一致 实践中的一致性权衡金融系统:…...

数据库原理及应用mysql版陈业斌实验四

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表(学生表&…...

华为OD机试真题——最长的顺子(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录全流程解析/备考攻略/经验…...

【HTML】html文件

HTML文件全解析:搭建网页的基石 在互联网的广袤世界里,每一个绚丽多彩、功能各异的网页背后,都离不开HTML文件的默默支撑。HTML,即超文本标记语言(HyperText Markup Language),作为网页创建的基…...

使用 XWPFDocument 生成表格时固定列宽度

一、XWPFDocument XWPFTable个性化属性 1.初始默认写法 XWPFTable table document.createTable(n, m); //在文档中创建一个n行m列的表格 table.setWidth("100%"); // 表格占页面100%宽度// 通过getRow获取行进行自定义设置 XWPFTableRow row table.getRow(0); XW…...

足球AI模型:一款用数据分析赛事的模型

2023 年欧冠决赛前,某体育数据平台的 AI 模型以 78% 的概率预测曼城夺冠 —— 最终瓜迪奥拉的球队首次捧起大耳朵杯。当足球遇上 AI,那些看似玄学的 "足球是圆的",正在被数据与算法拆解成可计算的概率命题。今天我们就来聊聊&#…...

【ESP32|音频】一文读懂WAV音频文件格式【详解】

简介 最近在学习I2S音频相关内容,无可避免会涉及到关于音频格式的内容,所以刚开始接触的时候有点一头雾水,后面了解了下WAV相关内容,大致能够看懂wav音频格式是怎么样的了。本文主要为后面ESP32 I2S音频系列文章做铺垫&#xff0…...

万向死锁的发生

我是标题 1.欧拉角2.万向死锁 参考:小豆8593 1.欧拉角 欧拉角在Unity中描述的是一种变换(Transform)共有3个轴体,默认顺序为x->y->z. 2.万向死锁 可以把万向死锁的情况理解成:由于轴体旋转的顺序是固定的&am…...

JavaScript学习教程,从入门到精通,JavaScript BOM (Browser Object Model) 详解(18)

JavaScript BOM (Browser Object Model) 详解 1. BOM 介绍 BOM (Browser Object Model) 是浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象。BOM的核心对象是window,它表示浏览器的一个实例。 BOM包含的主要对象: window…...

人工智能与云计算:技术融合与实践

1. 引言 人工智能(AI)和云计算是当今科技领域最具变革性的两项技术。AI通过模拟人类智能解决问题,而云计算则提供了弹性可扩展的计算资源。两者的结合创造了前所未有的可能性,使企业能够以更低的成本部署复杂的AI解决方案。 本文将探讨AI与云计算的技术融合,包括核心概念、…...

42.[前端开发-JavaScript高级]Day07-手写apply-call-bind-块级作用域

手写apply-call-bind <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…...

ObjectInputStream 终极解析与记忆指南

ObjectInputStream 终极解析与记忆指南 一、核心本质 ObjectInputStream 是 Java 提供的对象反序列化流,继承自 InputStream,用于读取由ObjectOutputStream序列化的Java对象。 核心特性速查表 特性说明继承链InputStream → ObjectInputStream核心功能实现Java对象反序列化…...

数据结构有哪些类型(对于数据结构的简述)

在学习计算机时&#xff0c;数据结构是不可忽视的一点&#xff0c;从考研时的408课程&#xff0c;再到工作中编写软件&#xff0c;网站&#xff0c;要想在计算机领域站住脚跟&#xff0c;数据结构是必备的 在这里&#xff0c;我对于数据结构进行了汇总&#xff0c;并简要描述&…...

Vscode 插件开发

文章目录 1、使用vscode官方插件生成框架&#xff0c;下载脚手架2、使用脚手架初始化项目&#xff0c;这里我选择的是js3、生成的文件结构如下&#xff0c;重要的就是以下两个文件4、代码5、打包使用6、发布官网地址7、publisher ID undefined provided in the extension manif…...

C# string和其他引用类型的区别

在C#中&#xff0c;字符串&#xff08;String&#xff09;和其他引用类型&#xff08;Reference Types&#xff09;之间有几个关键的区别&#xff0c;这些区别主要体现在它们的内存管理、赋值行为以及使用方式上。 1. 内存管理 字符串&#xff08;String&#xff09;&#xff1…...

RTT添加一个RTC时钟驱动,以DS1307为例

添加一个外部时钟芯片 这里多了一个选项 复制drv_rtc.c,重命名为drv_rtc_ds1307.c 添加到工程中 /*** @file drv_rtc_ds1307.c* @brief * @author jiache (wanghuan3037@fiberhome.com)* @version 1.0* @date 2025-01-08* * @copyright Copyright (c) 2025 58* */ #...

常见的低代码策略整理

低代码策略通过简化开发流程、降低技术门槛、提升效率&#xff0c;帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面&#xff1a; 快速交付与降本增效 减少编码需求&#xff1a;通过可视化配置&#xff08;如变量替换、表达式函数&#xff09;替代传统编码…...

从彩色打印单行标准九九表学习〖代码情书〗的书写范式(Python/DeepSeek)

写给python终端的情书&#xff0c;学习代码设计/书写秘笈。 笔记模板由python脚本于2025-04-17 12:49:08创建&#xff0c;本篇笔记适合有python编程基础的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简…...

QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)

目录 引言相关阅读项目结构文件组织 核心技术实现1. 数据模型设计联系人项目类 (datamodel.h)数据模型类 (datamodel.h)数据模型实现 (datamodel.cpp) 2. 主程序入口点 (main.cpp)3. 主界面设计 (Main.qml)4. 联系人对话框 (ContactDialog.qml)5. 自定义组件CustomTextField.qm…...

postman莫名奇妙报错,可能是注释引起的。postman 过滤请求体中的注释。

postman莫名奇妙报错&#xff0c;可能是注释引起的。postman 过滤请求体中的注释。 1、问题描述2、问题分析3、解决方法 1、问题描述 postman http请求测试时&#xff0c;如果在请求体中添加了注释&#xff0c;那么这个注释会被带到服务端执行&#xff0c;导致服务端接口返回报…...

扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)

一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此&#xff0c;microeco包发表以来被学界广泛关注&#xff0c;截止2…...

中间件--ClickHouse-4--向量化执行(什么是向量?为什么向量化执行的更快?)

1、向量&#xff08;Vector&#xff09;的概念 &#xff08;1&#xff09;、向量的定义 向量&#xff1a;在计算机科学中&#xff0c;向量是一组同类型数据的有序集合&#xff0c;例如一个包含多个数值的数组。在数据库中&#xff0c;向量通常指批量数据&#xff08;如一列数…...

TDengine 存储引擎剖析:数据文件与索引设计(一)

TDengine 存储引擎简介 在物联网、工业互联网等快速发展的今天&#xff0c;时间序列数据呈爆发式增长。这些数据具有产生频率高、依赖采集时间、测点多信息量大等特点&#xff0c;对数据存储和处理提出了极高要求。TDengine 作为一款高性能、分布式、支持 SQL 的时序数据库&am…...

【kubernetes】pod.spec.containers.ports的介绍

目录 1. 说明2. 基本结构3. 字段说明4. 使用场景5. 示例6. 注意事项 1. 说明 1.在 Kubernetes 中&#xff0c;pod.spec.containers.ports 是 Pod 定义中用于配置容器端口映射的字段&#xff0c;其作用是声明容器需要监听的端口以及如何将这些端口暴露给 Pod 的外部访问。 2. …...

【SpringBoot+Vue自学笔记】001

跟着这位老师学习的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 前后端开发技术的全栈课程&#xff1a; Java EE企业级框架&#xff1a;SpringBootMyBatisPlus Web前端核心框架&#xff1a;VueElement UI 公共云…...

第十节:性能优化-如何排查组件不必要的重复渲染?

工具&#xff1a;React DevTools Profiler 方法&#xff1a;memo、shouldComponentUpdate深度对比 React 组件性能优化&#xff1a;排查与解决重复渲染问题指南 一、定位性能问题&#xff1a;React DevTools 高级用法 使用 React Developer Tools Profiler 精准定位问题组件&…...

MATLAB项目实战(一)

题目&#xff1a; 某公司有6个建筑工地要开工&#xff0c;每个工地的位置&#xff08;用平面坐标系a&#xff0c;b表示&#xff0c;距离单位&#xff1a;km&#xff09;及水泥日用量d(t)由下表给出&#xff0e;目前有两个临时料场位于A(5,1)&#xff0c;B(2,7)&#xff0c;日储…...

spring boot 文件下载

1.添加文件下载工具依赖 Commons IO is a library of utilities to assist with developing IO functionality. <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version> </depe…...

HTTP 2.0 协议特性详解

1. 使用二进制协议&#xff0c;简化传输的复杂性&#xff0c;提高了效率 2. 支持一个 TCP 链接发起多请求&#xff0c;移除 pipeline HTTP/2 移除了 HTTP/1.1中的管道化&#xff08;pipeline&#xff09;机制&#xff0c;转而采用多路复用&#xff08;Multiplexing&#xff0…...

微服务链路追踪:SleuthZipkin

文章目录 Sleuth & Zipkin一、Sleuth\&Zipkin介绍二、搭建环境三、Sleuth入门操作四、Zipkin搭建及操作五、RabbitMQ方式发送信息六、Elasticsearch持久化 SpringBootAdmin一、Actuator介绍二、Actuator快速入门三、SpringBootAdmin介绍四、SpringBootAdmin快速入门4.1…...