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

应用架构的演进 I 使用无服务器保证数据一致性

在微服务架构中,一个业务操作往往需要跨多个服务协作完成,包含了读取数据和更新多个服务的数据同时进行。在数据读取和写入的过程中,有一个服务失败了,势必会造成同进程其他服务数据不一致的问题。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点 这里让它成为你的技术宝库!

面对分布式事务,如何维护微服务应用架构的数据一致性呢?SAGA 是一种常用的管理分布式系统数据一致性的模式。

图片


 图 1 源于:《Microservices Patterns》
作者:Chris Richardson

SAGA 的关键思想是:

  • 每个操作都可以作为一个小的事务来执行。
  • 如果出现失败则补偿撤销已执行的操作。

这可以确保整体的数据最终保持一致。

有几种不同的方法来构建 SAGA 的协调逻辑:

1.协同式

协同式的工作原理如图所示,决策和执行顺序逻辑分布在 SAGA 的每一个参与方中;通过交换事件的方式进行沟通,订阅彼此的事件并做出相应的响应。

图片


 图 2 源于:《Microservices Patterns》
作者:Chris Richardson

协同式虽然复杂,但是适用于对事件发布的可靠性要求很高的场景。通常使用 Transaction Outbox 模式来确保事件被可靠地发布,即使发生系统故障。

图片


 图 3 源于:《Microservices Patterns》
作者:Chris Richardson

如图所示,在执行订单服务的业务逻辑时,在写入订单服务数据库的相应数据表的同时,不直接发布事件,再写一份到本地事务性的出站队列(Outbox)。只有当本地事务提交成功后,才异步地从 Outbox 中取出事件发布。一旦事件发布成功,就从 Outbox 删除这条事件。以此来确保:

  • 事件只会在本地事务提交后发布,不会在事务失败时发布。
  • 即使系统发生故障,事件也不会丢失,会在系统重启后从 Outbox 重新发布。
  • 每个事件只会发布一次,不会重复发布。

Transaction Outbox 模式牺牲了发布事件的实时性,以换取发布的可靠性,同时配置实现相对比较复杂。我们可以通过云原生服务比如 DynaomDB Stream 保证实时性和可靠性,还能降低配置的复杂度。DynaomDB Stream 是亚马逊云科技提供的一种轻量级的变更数据捕获机制,实现了一种流式的变更日志,可以对 DynamoDB 表中的数据进行近乎实时的数据变更监控。

图片

如图所示的 DynamoDB Streams 工作机制:

  • 当表中有数据更改(创建、更新、删除)时,DynamoDB 会将这些更改的详细信息以流的形式记录在 DynamoDB Streams 中。
  • 流包含了对表的操作类型(插入、修改、删除)以及操作前后的完整数据内容。
  • 应用程序可以通过各种方式消费流,以实现近实时的数据处理和分析。

DynamoDB Streams 有以下特点:

  • 全量的变更捕获,无信息丢失。
  • 可以消费多次,对读取流没有影响。
  • 多个应用可以同时消费一个流。
  • 按顺序保存和传递变更信息。
  • 与表直接整合,无需建立独立的流。

2.编排式

编排式—决策和执行顺序逻辑集中在一个 SAGA 编排器中;排版器发出命令消息给各个参与方,指示参与方服务完成本地事务操作。

图片


 图 5 源于:《Microservices Patterns》
作者 Chris Richardson

我们可以利用云原生服务和工具来进一步提高编排式 SAGA 模式的工作和生产效率。比如使用 Amazon Step Functions 提供可视化的无服务器工作流,来编排 SAGA 中一系列分布式操作。利用 Step Functions 的编排机制来协调 SAGA 中各个服务的交互。

图片


 图 6

在亚马逊云上,可以通过 Step Functions 来坐标 SAGA 模式的各个函数执行流程。无服务器服务可以提供保证:

  • AmazonLambda+AmazonDynamoDB: 实现幂等函数和事务写入。
  • AmazonSQS: 作为函数之间的异步通信。
  • AmazonSNS: 发布—订阅模型进行函数触发。
  • AmazonCloudWatch: 记录函数执行日志。
  • ….

小结

SAGA 模式+无服务器云原生服务,可以较好地在保证一致性和高弹性之间取得平衡。亚马逊广泛采用这种架构和技术栈支持其业务。

图片

文章来源:
https://dev.amazoncloud.cn/column/article/6548b24dde82943ae0ac42fc?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN 

相关文章:

应用架构的演进 I 使用无服务器保证数据一致性

在微服务架构中,一个业务操作往往需要跨多个服务协作完成,包含了读取数据和更新多个服务的数据同时进行。在数据读取和写入的过程中,有一个服务失败了,势必会造成同进程其他服务数据不一致的问题。 亚马逊云科技开发者社区为开发者…...

jupyter修改默认打开目录

当我们打开jupyter notebook(不管用什么样的方式打开,使用菜单打开或者是命令行打开是一样的)会在默认的浏览器中看到这样的界面、 但是每一台不同的电脑打开之后的界面是不同的,仔细观察就会发现,这里面现实的一些文件…...

HTML5学习系列之标题和正文、描述性信息

HTML5学习系列之标题和正文、描述性信息 标题和正文标题段落 描述性信息强调注解备选上下标术语代码预定义格式缩写词编辑提示引用引述换行显示修饰非文本注解 总结 标题和正文 标题 按语义轻重排列&#xff1a;h1\h2\h3\h4\h5\h6 <h1>诗词介绍</h1> <h2>…...

互联网医院系统:数字化时代中医疗服务的未来

随着数字化时代的发展&#xff0c;互联网医院系统在医疗服务中的作用日益凸显。本文将讨论互联网医院系统的一些关键技术方面&#xff0c;探讨这些技术如何推动医疗服务进入数字化时代。 1. 数据智能与个性化服务 互联网医院系统依赖于大数据分析和人工智能技术&#xff0c;…...

(C语言)输入一个序列,判断是否为奇偶交叉数

#include <stdio.h> #include <string.h> int main() {char str[50];gets(str);int len,tmp 1;len strlen(str); //获取字符串长度 for (int i 0;i < len-1 ;i ){if((str[i] % 2 0 ) && (str[i1] % 2 ! 0)) //判断先偶数后奇数序列 tmp ;else if((s…...

蓝桥杯模拟赛:最远滑行距离 ← dfs

【题目来源】https://www.lanqiao.cn/problems/2414/learning/【题目描述】 小蓝准备在一个空旷的场地里面滑行&#xff0c;这个场地的高度不一&#xff0c;小蓝用一个 n 行 m 列的矩阵来表示场地&#xff0c;矩阵中的数值表示场地的高度。 如果小蓝在某个位置&#xff0c;而他…...

广东电信手机号余额查询接口

接口地址&#xff1a;https://gdty.gd189.cn/MOService/mapi/moduleRecharge/recharge/querySerCount 请求参数&#xff1a; {"mphone":"15303*05139","mareaCode":"","busiId":"CDMA","chongzhiType&qu…...

这次轮到微软炸场了;5000+AI工具调研报告 (500万字);狂打一星开喷AI聊天机器人;CMU LLM课程;AI创业的方向与时机 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f251; Microsoft Ignite 2023 技术大会&#xff1a;微软的年度炸场时刻&#xff0c;而且连炸四天 https://ignite.microsoft.com OpenAI 开发…...

--max-old-space-size=8192报错

vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

单区域OSPF配置

配置命令步骤&#xff1a; 1.使用router ospf 进程ID编号 启用OSPF路由 2.使用network 直连网络地址 反掩码 area 0 将其归于区域0 注意&#xff1a;1.进程ID编号可任意&#xff08;1-65535&#xff09;2.反掩码用4个255相减得到 如下图&#xff0c;根据给出要求配置OSPF单区…...

VsCode 安装 GitHub Copilot插件 (最新)

##在线安装&#xff1a; 打开Vscode扩展商店&#xff0c;输入 "GitHub Copilot " ,选择下载人数最多的那个。&#xff08;这个是你写一部分代码或者注释&#xff0c;Ai自动帮你提示/补全代码&#xff09;,建议选择这个 注意下面有个和他类似的 "GitHub Copilo…...

人工智能基础_机器学习039_sigmoid函数_逻辑回归_逻辑斯蒂回归_分类神器_代码实现逻辑回归图---人工智能工作笔记0079

逻辑斯蒂回归(Logistic Regression)是一种常用的分类算法,其基本思想是通过拟合一个逻辑斯蒂函数来预测样本所属的类别。它广泛应用于各个领域,如医学、金融、市场营销等,具有较好的解释性和可解释性。在逻辑斯蒂回归中,我们通常使用的是二分类问题,即样本只属于两个类别…...

购买阿里云服务器需要多少钱?活动价3000元-5000元的阿里云服务器汇总

购买阿里云服务器需要多少钱&#xff1f;如果我们只有3000元-5000元的预算可以购买什么实例规格和配置的阿里云服务器呢&#xff1f;因为阿里云服务器价格是由实例规格、配置、带宽等众多配置决定的&#xff0c;所以&#xff0c;目前阿里云活动中的价格在3000元-5000元的云服务…...

CentOS修改root用户密码

一、适用场景 1、太久没有登录CentOS系统&#xff0c;忘记管理密码。 2、曾经备份的虚拟化OVA或OVF模板&#xff0c;使用模板部署新系统后&#xff0c;忘记root密码。 3、被恶意攻击修改root密码后的紧急修复。 二、实验环境 1、VMware虚拟化的ESXI6.7下&#xff0c;通过曾经…...

Android消息机制(Handler、Looper、MessageQueue)

一、ThreadLocal 1、什么是ThreadLocal ThreadLocal 是一个线程内部的数据存储类&#xff0c;通过它可以在指定的线程中存储数据&#xff0c;数据存储以后&#xff0c;只有在指定线程中可以获取到存储的数据&#xff0c;对于其他线程来说则无法获取到数据。 一般来说&#xf…...

Pikachu漏洞练习平台之XXE(XML外部实体注入)

目录 什么是 XML&#xff1f; 什么是DTD&#xff1f; 什么是XEE&#xff1f; 常见payload 什么是 XML&#xff1f; XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;&#xff1b; XML 不会做任何事情&#xff0c;而是用来结构化、存储以及传输信息…...

ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么

在早期版本的Ubuntu中&#xff0c;通常会使用 /etc/rc.local 或 /etc/init.d/rc.local 文件执行在系统启动时需要运行的自定义脚本或命令。然而&#xff0c;随着Ubuntu的版本升级&#xff0c;这两者的使用方式有了一些变化。 /etc/rc.local&#xff1a; 功能&#xff1a; /etc/…...

vue项目中 commonJS转es6

背景&#xff1a;项目中需要使用一个插件&#xff0c;但是插件底层是commonJS语法 项目结构&#xff1a;webpackvue2.x 转换准备工作 安装插件&#xff1a; 以下插件如已安装请忽略 npm install babel/preset-env vue/cli-plugin-babel/preset babel/plugin-transform-runt…...

【C++】AVL树(动图详解)

文章目录 一、前言二、AVL树的概念&#xff08;引入bf&#xff09;三、AVL节点树的定义四、AVL树的基本框架五、AVL树的旋转5.1左单旋&#xff08;新节点插入较高右子树的右侧---右右&#xff1a;左单旋&#xff09;例一&#xff08;h0&#xff09;例二&#xff08;h1&#xff…...

「Verilog学习笔记」用3-8译码器实现全减器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 首先列出3-8译码器和全减器的真值表 全减器真值表如下 3-8译码器真值表如下 timescale 1ns/1nsmodule decoder_38(input E ,input A0 …...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...