亚马逊 DynamoDB 交易框架

Amazon DynamoDB 支持 交易以提供原子性、一致性、隔离性和持久性 (ACID),从而帮助您保持工作负载中的数据一致性。数据库事务是对一个或多个表执行的多项操作的序列。这些由多个操作组成的序列代表一个工作单元,该工作单元已提交到表中或一起回滚。使用 DynamoDB API,您可以在单个 亚马逊云科技 账户和 亚马逊云科技 区域内的一个或多个表中强制执行 ACID 属性。

开发人员熟悉 ACID 事务的概念,但在使用 DynamoDB 事务 API 时他们有时会遇到困难,因为 SQL 中的事务以不同的格式呈现和提交。

在这篇文章中,我们介绍了一个框架,该框架使用分层方法以开发人员熟悉的格式标准化和呈现 DynamoDB 事务。在这篇文章中,我们使用 C# 中的 ASP.NET Core 来展示如何使用该框架。你可以在任何其他平台上或使用不同的编程语言来实现这种设计模式。

该框架的目的是:

  • 以开发者熟悉的格式呈现 DynamoDB API
  • 将交易流程与专用的单一责任框架分离,供多个客户端应用程序使用
  • 提供接口隔离,因此框架的客户无需担心 DynamoDB 交易 API 的格式

框架设计概述

这篇文章中介绍的事务框架将 DynamoDB API 封装到一个通用的事务范围类中,该类维护要提交或回滚的事务项目。该框架从 TransactScop e 类开始,该类被设计为事务客户端应用程序的接口。您可以使用它来简化应用程序客户端使用的事务流程,封装 DynamoDB API 调用。需要时,应用程序用户调用可用的方法来开始、提交或回滚事务。

在框架中间,为了控制事务逻辑(例如在交易中添加或删除项目),我们使用名为 TransactExtensions 的扩展类。 TransactExt ension s 类允许将数据库放置、更新和删除操作的事务操作请求添加到 TransactScope 实例。

为了帮助将不同的数据类型转换为相应的 DynamoDB 项目属性,我们使用了一个名为 AttributeValueExtensions 的扩展类。

交易工作流程概述

下图说明了交易工作流程,以下段落对此进行了描述。服务组件代表客户端应用程序,它了解开始、提交或回滚事务的业务逻辑。

当典型的工作流程启动时, TransactScop e 类会初始化其内部 DynamoDB 客户端对象和操作容器。该操作以 DynamoDB 表项为目标,用于添加、更新或删除操作。这些操作可以针对不同表中的项目,但不能针对不同的 亚马逊云科技 账户或区域。任何两个操作都不能针对同一个项目。例如,您不能在同一笔交易中对同一商品进行状况检查和更新操作。

我们将继续将其称为 “服务” 的用户应用程序使用Att ributeValueExtensions 向项目添加各种类型的属性,然后通过TransactEx tensions将项目添加到T rans actScope中的容器中。

项目操作完成后,该服务可以将项目提交到 DynamoDB 表中,这样项目要么全部成功,要么全部失败。该服务可以通过移除 TransactScope 对象来回滚作用域 并清理容器。

使用框架的用例示例

此示例通过在原子事务中添加、删除和更新操作来演示框架的使用模式。它使用交易框架和分层方法来说明三种不同产品类型的交易操作: 专辑 书籍 电影 这三种产品类型的项目保留在三个 DynamoDB 表中: 相册 书籍和电影。

对于专辑表,每个专辑产品都有一个 “ 艺术家” 和 “ 标题” 属性,其中 “ 艺术家” 是 专辑 表的分区键 (PK), 标题 是排序键 (SK)。这种方法允许用户搜索艺术家的专辑。例如,你可以查询艺术家约翰·塞巴斯蒂安·巴赫的专辑,或者获取专辑标题 6 Partitas。图书具有 “ 作者” 、“ 出版日期 ” 和 “书” 属性 ,其中 作者 图书 表的 PK, 标题 是 SK。例如,您可以从作者荷马那里查询《奥德赛》一书,然后获取 “ 出版日期” 为 1614 年,“语言” 为 “英语” 的属性。 电影产品具有 导演 流派 标题等属性 ,其中导演是 电影 桌的 PK, 标题 是 SK。例如,你可以查询查理·卓别林的电影《小子》,然后得知它属于 喜剧、戏剧和儿童 题材类型

另一种方法是使用通用 PK 和 SK 将具有不同前缀的不同实体存储在同一个表中,例如 A # 代表专辑歌手, B# 代表图书作者, M# 代表电影导演。例如, A #Johann 塞巴斯蒂安·巴赫 B #Homer 和 M #Charlie 卓别林 。在此示例中,我们将继续使用 3 个不同的表。

我们使用以下前端用户界面(在以下 GitHub 存储库 中 )在三个不同的表上运行交易。以下是用户将关注的事件顺序:

  1. 通过选择 “ 创建产品表”(图书、相册、电影)来创建这三个表 。
  2. 选择 “ 开始交易” 以开始新的交易。
  3. 在 “ 产品类型” 下拉菜单 上选择 “ 相册 ” 、“图” 或 “ 电影”。
  4. 在产品类型 下拉列表中添加相应 的产品属性。
  5. 选择 “ 添加项目” 或 “ 删除项目” ,在相应的表格中添加项目或从中移除项目。
  6. 要更新项目,请输入产品 PK 和 SK,然后选择 “ 检索项目” 以获取项目的最新版本,根据需要更改属性,然后选择 “ 添加项目” 。
  7. 选择 “ 提交事务” 将事务项提交到表中,或选择 “ 取消事务” 以回滚事务。

分层方法

我们使用接口和实现方法使用三层(前端、服务和数据提供商)来实现此示例。接口定义了层的原型,实现包含详细信息。然后,前端层通过其接口与服务层进行交互以创建表;开始事务;添加、更新或删除项目;然后提交或回滚事务。接下来,服务层具有核心业务逻辑,它与 专辑 图书 电影 产品类型管理的数据提供者层和交易框架进行交互。数据提供者层将 DynamoDB API 与服务层分离,用于 DynamoDB 项目操作。

创建表

选择 “ 创建产品表”(图书、相册、电影) 以启动 createTablebtn_Clic k 函数,该功能随后调用 ProductServic e 层三次以创建相册、书籍和电影表。

我们使用 ProductProvid er 来创建相应的表,它使用 DynamoDB API 来运行 createTable 任务并创建表

开始交易

选择 “ 开始交易” 以启动 be ginTransactionbtn_Clic k 函数,该函数调用 ProductService 层来启动事务。

ProductService 函数使用 beginTranscation 方法启动事务 ,该 方法调用 TransactScope 中的 Begin 方法。 然后, TransactScope 使用 Begin 方法 初始化 Trans actWriteItemsRequest 中的容器。

添加交易项目

你可以访问 GitHub 存储库 ,探索如何使用 TransactExtension s 类来添加和映射交易

属性扩展

这个常见的扩展类用于通过将实体对象转换为 亚马逊云科技 A ttributeValu e 类型来构建常规项目操作。你可以在 属性值 扩展类中对此进行探索。

关于交易的一些评论:

  • 标准化数据结构是 ACID 要求的主要驱动力。使用 DynamoDB,其中许多要求是通过将项目聚合存储为一组项目或行来满足的。每个单项操作都是 ACID,因为没有两项操作可以部分影响物品。
  • 避免使用事务来维护 DynamoDB 上的标准化数据集。
  • 交易是提交不同项目的更改或执行有条件的批量插入/更新的绝佳用例。
  • 在处理交易 时,请考虑以下 最佳实践
  • 事务可以在多个表中发生,但两个操作不能同时针对 DynamoDB 中的同一个项目。
  • 每笔交易中最多有 100 个操作请求。
  • 每笔交易仅限于一个 亚马逊云科技 账户或区域。

结论

在这篇文章中,我们介绍了一个框架,该框架将使用类似于 SQL 数据库中事务的方法,帮助开发人员在 DynamoDB 中扩展对事务的使用。该框架构建了一个通用、可重复使用的框架,用于封装 DynamoDB 事务 API,使服务层能够处理常规的项目操作,而无需了解或理解 DynamoDB 事务 API 的详细信息。这允许在任何时候启动事务,并且在使用 DynamoDB 等 NoSQL 数据库时更容易启动事务。

该框架中有两个基本概念:事务作用域,它将标准项目操作转换为事务项目,以及用于将实体对象转换为 DynamoDB 属性值的扩展类。为了展示该框架的用法,我们使用该框架和分层方法创建了一个示例应用程序来管理三个不同的表。

我们使用.Net Core 和 awssdk.dynamodbv2 以 C# 编程语言编写了示例代码。您可以在
GitHub 存储库 中找到完整的示例代码和实现本文中描述的设计模式的示例应用程序


作者简介

Jeff Chen,亚马逊云科技 专业服务 首席架构师。作为技术负责人,他与客户和合作伙伴合作制定云迁移和优化计划。在业余时间,杰夫喜欢与家人和朋友共度时光,探索乔治亚州亚特兰大附近的山脉。

Esteban Serna ,Sa Dyn amoDB 高级专家。在过去的15年中,Esteban一直与数据库合作,帮助客户选择合适的架构来满足他们的需求。刚从大学毕业的他开始部署支持分布式地点的联络中心所需的基础设施。自从 NoSQL 数据库问世以来,他就爱上了它们,并决定专注于它们,因为集中计算已不再是常态。如今,Esteban 专注于帮助客户使用 DynamoDB 设计需要个位数毫秒延迟的分布式大规模应用程序。有人说他是一本开放的书,他喜欢与他人分享自己的知识。