【问题标题】:What are some ways to maintain data consistency at the application layer of NoSQL?在 NoSQL 的应用层维护数据一致性的方法有哪些?
【发布时间】:2012-09-09 14:21:11
【问题描述】:

我的 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 支持通过电子邮件或员工 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.

还有其他技巧吗?

【问题讨论】:

标签: python nosql amazon-dynamodb


【解决方案1】:

简短的回答是:没有办法确保一致性。这是您在迁移到 NoSQL 时同意为性能和可扩展性而付出的代价。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    免责声明:我并没有真正使用过 DynamoDB,只是查看了数据模型和 API,所以请看它的价值。

    您提供的用例是一个用于数据的主表,其他表用于手动索引。这听起来确实像是为 RDBMS 工作(可能需要一些分片以促进增长)。但是,如果这不能解决问题,这里有几个想法可能适合您,也可能不适合您。

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

    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 之类的东西,它是一个分布式系统,用于管理锁等共享资源。这会增加工作量和开销,但您可以将其设置为做您想做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多