【问题标题】:Read-your-own-writes consistency in MongodbMongodb 中的 Read-your-own-writes 一致性
【发布时间】:2012-09-14 16:48:12
【问题描述】:

首先,这是 Pymongo Documentation中所说的

默认情况下,当线程第一次在 MongoDB 上运行操作时,PyMongo 会为每个线程启动一个请求。这保证了**read-your-writes 的一致性。在一个请求中,线程将继续独占使用同一个套接字,并且没有其他线程将使用这个套接字,直到线程调用 end_request() 或它终止。此时,套接字将返回到连接池以供其他线程使用。

那么当对 Mongodb 使用异步库(如 Asyncmongo、Motor)时,用户是否会拥有像阻塞调用那样的一致性或最终一致性?

【问题讨论】:

    标签: mongodb asynchronous tornado pymongo eventual-consistency


    【解决方案1】:

    关于这个问题有几点。

    1. 除非您在写入时使用"safe=true""w=1"(或更高版本)或"j=true",否则无法保证您具有写后读一致性。您可以将这些作为 insert() 或 update() 命令的一部分包含在内,或者使用 set_lasterror_options() 为您正在使用的连接、数据库或集合设置这些选项。

    2. 如果您允许从辅助节点进行读取(例如,除了 PRIMARY 之外的 ReadPreference),那么您将不会获得先读后写语义,而只会获得最终一致性。

    3. 如果您使用 PRIMARY 的 ReadPreference 并且设置了适当的 lasterror 选项,则可以保证在使用相同套接字的所有操作上获得 read-after-write 语义,即同一个线程。

    4. 如果您使用多个线程,并且不是从辅助节点读取,那么只要您在写入后的第二个线程中发出读取,就可以保证获得写入后读取的一致性在第一个线程中完成。您可以使用标准线程同步原语来确保这一点。

    【讨论】:

    • 我认为您提供了所有可能性:D 正在将 mongodb 与龙卷风一起使用,而在龙卷风中,它是一个事件循环,因此很难获得线程,那么异步库(不使用线程)
    • 嗯...这取决于您使用的异步库。相同的规则适用:只有在 getLastError() 命令成功返回后,您才能保证阅读您所写的内容。一旦从 getLastError() 成功返回,任何启动 find() 的线程都会看到写入的数据。线程之间的同步留给读者练习。
    • 我认为这是答案,因为它是以一般的方式说话,所以我只需要看看 Motor 或 Asyncmongo 是如何工作的:D 再次感谢您
    • 对于Motor,你需要有一个回调函数,并且一旦回调函数完成并且没有错误,你就可以读取你写的内容。参考:emptysquare.net/motor/pymongo/api/motor/…
    • 我开始学习异步调用,所以这就是我问这个问题的原因,给我更多的“能量”来学习它,你给了我很多:D再次感谢你
    【解决方案2】:

    我是 Motor 的作者,对 AsyncMongo 也略知一二。这是 Motor 关于安全写入的文档:

    http://emptysquare.net/motor/pymongo/api/motor/differences.html#acknowledged-writes

    简短回答:无论您在 insert()、update() 等的回调中执行什么代码,如果这些插入或更新是安全,将在 之后在 MongoDB 中看到数据 更改已应用。您在此类回调中执行的任何代码都可能在 MongoDB 应用更改之前或之后运行。

    【讨论】:

    • 谢谢 :D 顺便说一句,除了使用异步方式之外,Motor 将使用所有 pymongo 查询?
    • 正确,这是本意。 =)
    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多