GAE交易失败和幂等性

2023-11-27

Google App Engine 文档包含以下段落:

注意:如果您的应用程序在提交时收到异常 交易失败并不总是意味着交易失败。你 可以接收DatastoreTimeoutException, ConcurrentModificationException 或 DatastoreFailureException 事务已提交的情况下的例外情况 最终都会申请成功。只要有可能,就让你的 数据存储事务是幂等的,因此如果您重复事务, 最终结果是一样的。

等等,什么?似乎有一类非常重要的事务根本无法实现幂等,因为它们依赖于当前的数据存储状态。例如,一个简单的计数器,如“like”按钮。事务需要读取当前计数,将其递增,然后再次写出计数。如果交易看起来“失败”,但实际上并没有失败,并且我无法在客户端告诉这一点,那么我需要重试,这将导致一次点击生成两个“喜欢”。 GAE 肯定有办法防止这种情况发生吗?

Edit:

这似乎是分布式系统固有的问题,正如 Guido van Rossum 所言——请参阅此链接:

App Engine 数据存储区事务异常

因此,如果您想要高度的可靠性,设计幂等事务几乎是必须的。

我想知道是否有可能在整个应用程序中实现一个全局系统以确保幂等性。关键是在数据存储中维护事务日志。客户端将生成一个 GUID,然后将该 GUID 包含在请求中(在重试同一请求时将重新发送相同的 GUID)。在服务器上,在每个事务开始时,它将在数据存储中查找事务实体组中具有该 ID 的记录。如果它找到了,那么这是一个重复的事务,所以它会返回而不做任何事情。

当然,这需要启用跨组事务,或者将单独的事务日志作为每个实体组的子级。此外,如果失败的实体键查找速度很慢,性能也会受到影响,因为几乎每个事务都会包含失败的查找,因为大多数 GUID 都是新的。

就额外数据存储交互方面的额外成本而言,这可能仍然比我必须使每个事务幂等的情况要少,因为这需要大量检查每个级别的数据存储中的内容。


丹·威尔克森、西蒙·戈德史密斯等人设计了一个彻底的全球交易系统在应用程序引擎的本地(每个实体组)事务之上。在较高的层次上,它使用与您描述的 GUID 类似的技术。丹处理了“潜艇写入”,即您描述的报告失败但后来显示成功的事务,以及数据存储的许多其他理论和实践细节。埃里克·阿姆布鲁斯特 (Erick Armbrust) 实现了丹的设计木薯.

我不一定建议你实现他的设计或使用tapioca-orm,但你肯定会对这项研究感兴趣。

回答你的问题:很多人实现的 GAE 应用程序使用的数据存储没有幂等性。仅当您需要具有某些类型的保证(如您所描述的保证)的交易时,这一点才重要。了解何时确实需要它们,但通常不需要它们,这一点绝对很重要。

数据存储是在megastore之上实现的,对此进行了深入描述在本文中。简而言之,它使用多版本并发控制在每个实体组内和Paxos用于跨数据中心的复制,这两者都有助于海底写入。我不知道数据存储中是否有关于潜艇写入频率的公众号,但如果有,使用这些术语进行搜索并在数据存储邮件列表上应该可以找到它们。

亚马逊的 S3 并不是一个真正可比的系统;它更像是一个 CDN,而不是分布式数据库。亚马逊的 SimpleDB 与之相当。它最初只提供最终一致性,并最终添加了一种非常有限的交易类型,他们称之为条件写入,但它没有真实的交易。其他 NoSQL 数据库(redis、mongo、couchdb 等)在事务和一致性方面有不同的变化。

基本上,分布式数据库总是在规模、事务广度和一致性保证强度之间进行权衡。这是埃里克·布鲁尔最出名的CAP定理,它表示权衡的三个轴是一致性、可用性和分区容错性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GAE交易失败和幂等性 的相关文章

随机推荐

  • 如何在c中创建n叉树

    include
  • if 语句中 i++ 与 i=i+1 有什么区别? [复制]

    这个问题在这里已经有答案了 对于第一个代码 int i 1 while i lt 10 if i 2 0 System out println i 系统输出 3 5 7 9 对于第二个代码 int i 1 while i lt 10 if
  • UIViewController 中嵌入的 UIHostingController - 如何从外部更新 @State?

    我正在使用一个UIHostingController镶嵌ContentView inside ViewController 我想更改名称ContentView s name当按下 更改名称 按钮时 这是我的代码 class ViewCont
  • .NET 中非矩形形式的平滑边缘

    我使用 Form Region 创建了一个带有圆角的表单 它有效 但不幸的是四舍五入看起来很粗糙 有什么技巧可以平滑这种形状的角吗 我知道很多应用程序都支持这一点 只是不确定如何在 NET 中实现它 多谢你们 对此没有好的解决办法 区域无法
  • gcloud app 部署错误:获取应用程序 [apps/] 时出现权限错误

    我通过发出以下命令来部署一个简单的 Python 3 App Engine 应用程序 Flexi 环境 gcloud app deploy version ver0 1 并出现以下错误 ERROR gcloud app deploy Per
  • 更改 JOptionPane 中的确定取消字符串

    我想知道是否可以将 确定取消 按钮更改为java中的自定义字符串 我有 JOptionPane showConfirmDialog message title JOptionPane OK CANCEL OPTION 现在 按钮将显示 确定
  • 修改节点进程环境或参数运行时

    是否可以修改process 例如process argv push something 似乎其他模块没有接收参数中的更改 我想 欺骗 另一个模块 使其表现得像进程启动时指定了某个参数一样 进程是否为加载时的每个模块进行实例化 因此全局不可变
  • 在 React Native 中从本地 json 文件导入文本

    我想知道常见的方法是将巨大的文本导入视图 就我而言 我正在为 Android 和 iOS 开发一个 React Native 应用程序 并且在我的视图之一上我想展示 使用条款 文档 现在 当我只是将其导入 复制粘贴到文本组件中时 它就不是正
  • IE7 中 100% 宽度的文本区域忽略父元素的宽度

    我有以下内容textarea in a table table width 300 tr td td tr table
  • 解释 VS 描述 mysql 中的异常

    MySQL 中的 EXPLAIN 和 DESC 命令有什么区别 Explain会给你更多 有关查询的信息 describe会给你更多 有关表或列的信息 您还可以对表名使用 EXPLAIN 在这种情况下 它的行为与 DESCRIBE 完全相同
  • 如何使用 Javascript 延迟提交表单

    我正在尝试在我正在编写的 chrome 扩展中延迟自动提交表单 但它似乎没有提交 下面是我的表单和 javascript function submitForm submits form document getElementById is
  • 完整 .Net 中的实体框架核心?

    有没有办法在完整的 Net Framework 控制台应用程序中实现 Entity Framework Core 首先 您需要创建具有完整 net 框架的控制台应用程序 其次使用包管理器控制台安装这些包 Install Package Mi
  • 将 RDD[org.apache.spark.sql.Row] 转换为 RDD[org.apache.spark.mllib.linalg.Vector]

    我对 Spark 和 Scala 比较陌生 我从以下数据框开始 由密集的双精度向量组成的单列 scala gt val scaledDataOnly pruned scaledDataOnly select features scaledD
  • 为什么我们需要 IEEE 754 余数?

    我刚刚读过这个话题 尤其是最后的评论 然后我想知道 为什么我们真正需要这个是为了给剩下的 但似乎之前没有多少人 在谷歌上 对此感兴趣 如果您正在寻找想要它的原因 其中之一就是所谓的 范围缩小 假设你想要sind用于计算参数正弦值 以度为单位
  • Azure 上的 Django 应用程序未获取静态文件

    在 Azure Web 应用程序上获取了我的 Django 项目 但是当我在 SSH 终端上调用时 Python 管理 py 收集静态 它说复制了 252 个文件 但我的静态文件在我的模板上不可见 并且 wwwroot 中的静态文件夹是空的
  • 删除所有文件和文件夹但排除子文件夹

    我有一个文件夹 需要删除除一小部分文件和文件夹之外的所有文件和文件夹 我已经可以排除文件列表 但没有找到排除文件夹及其内容的方法 这是文件夹结构 C temp C temp somefile txt C temp someotherfile
  • 在字符串内包含引号?

    我正在尝试将引号包含在字符串中以添加到文本框 我正在使用此代码 t AppendText Dim Choice count As String Your New Name is pt1 pt2 vbNewLine 但它不起作用 我希望它像这
  • 从大型数据集中随机采样

    我从一个大型数据库中提取了研究人群 为了进行比较 我想选择一个具有相似特征的对照组 我想要匹配的两个标准是年龄和性别 为我提供用于匹配目的的数字的查询是 select sex age 10 as decades COUNT as count
  • URL/子域重写 (htaccess)

    假设我有以下文件 http www example com images folder image jpg 我想把它放在 http s1 example com folder image jpg 我如何进行 htaccess 重写以将其指向
  • GAE交易失败和幂等性

    Google App Engine 文档包含以下段落 注意 如果您的应用程序在提交时收到异常 交易失败并不总是意味着交易失败 你 可以接收DatastoreTimeoutException ConcurrentModificationExc