有哪些方法可以在NoSQL的应用层维护数据一致性?

时间:2012-09-09 14:21:11

标签: python nosql amazon-dynamodb

我的python Web应用程序使用DynamoDB作为其数据存储区,但这可能适用于在应用程序层完成索引一致性的其他NoSQL表。我正在对数据进行去规范化并在几个表中创建指示以便于查找。

例如,对于我的用户表:

* Table 1: (user_id) email, employee_id, first name, last name, etc ...
  Table 2: (email) user_id
  Table 3: (employee_id) user_id

表1是我的“主表”,其中存储了用户信息。如果user_id已知,则可以在单个GET查询中检索有关用户的所有信息。

表2和3通过电子邮件或employee_id启用查找,要求先查询这些表以获取user_id,然后再向表1查询以检索其余信息。

我关注的是去标准化数据 - 从表1中处理删除的最佳方法是什么,以确保从表2 + 3中删除匹配数据?还要确保插入?

现在我的事件链是:

1. Insert row in table 1
2. Insert row in table 2
3. Insert row in table 3

最后添加“支票”是否有意义?有点像:

4. Check that all 3 rows have been inserted.
5. If a row is missing, remove rows from all tables and raise an error.

还有其他技术吗?

2 个答案:

答案 0 :(得分:2)

简短回答是:无法确保一致性。这是您在性能和可扩展性交易中转向 NoSQL 时同意支付的价格。

DynamoDB-mapper有一个“交易引擎”。事务对象是普通的DynamoDB项目,可以保留。这样,如果一个逻辑操作组(即事务)成功,我们可以通过查看持久状态来确定它。但我们没有办法确定它没有......

做一些广告:),dynamodb-mapper事务引擎支持

  • 单个/多个目标
  • 子交易
  • 创建对象的事务(尚未发布)

如果你正在推出自己的映射器(这是一项愉快的任务),请随时查看我们的源代码:https://bitbucket.org/Ludia/dynamodb-mapper/src/52c75c5df921/dynamodb_mapper/transactions.py

免责声明:我是主要的dynamodb-mapper项目之一。随意贡献:)

答案 1 :(得分:0)

免责声明:我实际上并没有使用过DynamoDB,只是查看了数据模型和API,因此请将其用于它的价值。

您提供的用例是数据的一个主表,其他表用于手动滚动索引。这听起来像是RDBMS的工作(可能有一些分片用于增长)。但是,如果这不会削减它,这里有一些可能适用于你的想法。

一个。保持原状。如果您永远不会从索引表中提供数据,那么只要您首先处理主表,您就可以负担延迟删除和插入。说这种情况发生了:

1) Delete JDoe from Main table
xxxxxxxxxx Process running code crashes xxxxxxx
2) Delete from email index       // Never gets here
3) Delete from employee_id index // Never gets here

好吧,如果出现“电子邮件”查询,您将从索引(现在陈旧)中解析相应的user_id,但它不会显示在主表上。您知道出了问题,因此您可以返回失败/错误并清理索引。换句话说,您只需要使用一些陈旧的数据并省去麻烦,并在必要时进行清理。你必须弄清楚需要多少陈旧数据,并且可能会编写一个每天做一些内务管理的脚本。

B中。如果您真的想模拟锁和事务,可以考虑使用Apache Zookeeper之类的东西,它是一个用于管理共享资源(如锁)的分布式系统。这将是更多的工作和开销,但你可以设置它来做你想要的。