应用架构的演进 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 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】数位和相等数对的最大和

文章目录 Tag题目来源题目解读解题思路方法一:哈希表 写在最后 Tag 【哈希表】【数组】【2023-11-18】 题目来源 2342. 数位和相等数对的最大和 题目解读 在数组中找出数位和相等数对的和的最大值。 解题思路 方法一:哈希表 维护一个不同的数位和表…

如何为初创企业选择合适的 ERP 系统?

**ERP系统**是制造、分销、供应链、金融、会计、风险管理等多个行业必不可少的企业技术解决方案。不论垂直行业、企业规模或目标受众如何,将ERP作为企业管理战略的核心部分都非常重要。 对于渴望发展的小型企业和初创企业来说,更是如此。大型企业需要对…

【广州华锐互动】VR技术助力中小学生安全教育,让学生在虚拟世界中学会自我保护!

随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进我们的生活。在教育领域,VR技术的应用也日益广泛,为传统的教育模式带来了革命性的变革。中小学生安全教育作为学生生活中的重要组成部分,其重要性不言而喻…

ubuntu20.04安装cv2

查看ubuntu的版本 cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE20.04 DISTRIB_CODENAMEfocal DISTRIB_DESCRIPTION"Ubuntu 20.04.3 LTS"更改镜像源 cp /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.listdeb http://mirr…

keepalived+haproxy配置集群和负载均衡

1、简介 1.1. Keepalived Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备…

Python使用大连理工情感本体提取文本的情感倾向

import pandas as pd # 导入词典 df pd.read_excel(Sentiment_dictionary\大连理工情感词汇本体\情感词汇本体.xlsx) # 我们暂时只使用 [词语,词性种类,词义数,词义序号,情感分类,强度,极性] df df[[词语, 词性种类, 词义数, 词义序号, 情感分类, 强度, 极性]] df.head()# 按…

使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。

研究并记录一下ADS仿真中Tx_Diff的EQ设置。原理图如下: 最上面是选择均衡方法Choose equalization method:Specify FIR taps,Specify de-emphasis和none。 当选择Specify de-emphasis选项时,下方可以输入去加重具体的dB值&#x…

手动调用绘图事件

//添加资源文件 //沾到项目底下 画一只路飞 //对绘图事件进行更新

vue-admin-template

修改登录接口 1.f12查看请求接口 模仿返回数据写接口 修改方式1 1.在env.devolopment修改 修改方式2 vue.config.js 改成本地接口地址 配置转发 后端创建相应接口,使用map返回相同的数据 修改前端请求路径 修改前端返回状态码 utils里面的request.js

【VSCode】Visual Studio Code 配置简体中文环境教程

介绍 Visual Studio Code(简称 VS Code)是一款轻量级的代码编辑器,它支持多种编程语言,并且具有丰富的功能和插件扩展。如果你更喜欢使用简体中文界面,那么本教程将向你展示如何在 VS Code 中配置简体中文环境。 步骤…

网络编程TCP/UDP

1 网络通信概述 1.1 IP 和端口 所有的数据传输,都有三个要素 :源、目的、长度。 怎么表示源或者目的呢?请看图 所以,在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象:server 和 clie…

【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型

1. 引入 QStandardItemModel类提供了一个通用的模型,用于存储自定义数据。 以下是其用法:该类属于gui模块,因此在.pro中,需添加QT gui,如果已存在,则无需重复添加。 首先,引入头文件&#xff…

基于Python实现大型家用电器和电子产品在线商店购买数据分析【500010098】

导入模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt获取数据 df pd.read_csv( r"./data/kz.csv",sep,)数据描述 该数据包含2020年4月至2020年11月从大型家用电器和电子产品在线商店购买的数据。 数据说明 event_time&#xff1a…

什么是CDN?什么是安全加速CDN?有什么优势?

安全加速CDN(Content Delivery Network)是一种网络架构,它通过在全球范围内部署服务器并缓存静态和动态内容来提供更快的Web页面加载和更好的用户体验。安全加速CDN可以保护网站免受DDoS攻击、恶意软件和其他安全威胁,从而提高网站的可用性和稳定性。它通…

基于ssm+vue交通事故档案系统

摘要 摘要是对文章、论文或其他文本的主要观点、结论和关键信息的简洁概括。由于你没有提供具体的文章或主题,我将为你创建一个通用的摘要。 本文介绍了一种基于SSM(Spring Spring MVC MyBatis)和Vue.js的交通事故档案管理系统的设计与实现…

Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件

文章目录 前言NetworkAnimatorAnimator的Trigger属性服务器权威模式(Server Authoritative Mode)客户端权威模式 (Owner Authoritative Mode)学习文档 前言 这个组件是NetCode常用的组件之一,NetworkAnimator跟NetworkTransform一样&#xf…

string类的总结

目录 1.为什么要学习string类 2.string的标准库 3.string类的常用接口说明 1.string类对象的常见构造 2.string类对象的容量操作 3.string类对象的3种遍历方法 3.1 [ ] 下标 3.2 基于范围的for循环 3.3 迭代器 4 string类对象的元素访问 4.1 operator[]: 4.…

抖音直播间涨粉助手,其开发流程与需要的技术和代码分享

先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、直播间涨人气的15种方法 直播间的人气就像水池中的水,想要有源源不断的流量,就要想办法把水龙头的水流开到最大,也就是要增加直播间曝光率&…

LLM大模型量化原理

大型语言模型(LLM)可以用于文本生成、翻译、问答任务等。但是,LLM 也非常大(显然,大型语言模型)并且需要大量内存。 这对于手机和平板电脑等小型设备来说可能具有挑战性。 可以将参数乘以所选的精度大小以…

使用maven命令打包依赖

1、maven仓库地址 阿里云地址:https://developer.aliyun.com/mvn/search 中央仓库地址:https://mvnrepository.com/ 2、下载方式 在地址栏中输入要搜索的依赖 选择需要的版本 (1)直接复制 (2)pom下载 …