我们有几个智能手机应用程序依赖于AmazonSimpleDB和s3。
架构通常非常简单,数据不敏感,每个应用程序没有太多用户,应用程序直接查询亚马逊(而不是在中间有我们自己的服务器)。
到目前为止一切都很好,完全满足了我们合理的需求。
但现在,我遇到了一个问题,我们的一个应用程序必须触发一个由2个SimpleDB put组成的操作。
问题是,这些"2次看跌"必须以原子的方式进行,作为要么全有要么全无的块。在2次输入之间,数据库没有完整性,任何人都不能在这种糟糕的状态下读取它。
因此,我所研究的是实现这一点的最简单方法,我想它将涉及某种队列,在这些队列中,操作被逐一处理,包括读取。
但老实说,这不是我的领域,我希望它不涉及在专用服务器上编写一些非常复杂的Web应用程序。
对于我显然还没有的那种知识,任何变通方法或建议都将不胜感激。
谢谢!
原子性和事务是关系数据库中的一些伟大功能,当使用像SimpledDB这样的NoSQL解决方案时,您会放弃这些功能。你可能想考虑一个便宜的托管MySQL数据库,比如亚马逊RDS或许多其他托管数据库供应商提供的数据库。然而,如果你想继续使用SimpleDB,你不需要排队,但可以滚动自己的交易,并按照Willy的建议进行:
- 在保存的项目中添加一个类似"提交"的属性
- 编写一个工具(或找到一个产品),可以更新您以前保存的所有项目,其值为committed=1
- 更新代码,使两步操作的第一步保存属性committed=0的项,第二步通过设置committed=1"提交"项
- 将所有查询更改为仅提取已提交的项,类似于"从您的_domain中选择*,其中{criteria1}和{criteria2}以及{more criteria}和committed='1'"