AsyncIOMotorCommandCursor.fetch_next 是否会阻止可重试读取?

时间:2021-06-04 08:00:45

标签: python mongodb pymongo mongodb-atlas

我正在尝试在 Mongo Atlas 集群故障转移期间使用 motor 诊断读取失败。 Retryable-Reads 规范定义了 aggregate calls are retryable,但是 Cursor.getMore is not。我的代码如下所示:

cursor = db.foo.aggregate([...])

if not await cursor.fetch_next:
    raise SomeException

doc = cursor.next_object()

此代码似乎不会在集群故障转移期间重试,因为它在内部调用 getMore 我假设。我不完全清楚情况是否如此。更不用说fetch_next is deprecated anyway

将其更改为这样会使其成为可重试读取吗?

async for doc in cursor:
    break
else:
    raise SomeException

或者这是否导致相同的内部处理,问题出在其他地方?

目标是尝试以可重试的方式从聚合管道(有一个或没有)读取单个结果文档,如果没有则引发异常。

1 个答案:

答案 0 :(得分:0)

您需要挽救驱动程序在此代码之外的网络错误中引发的任何异常,并在这种情况下重复整个迭代。

驱动程序会自动重试初始查询,但不会重试 getMores,因为这些查询无法指定结果集中的位置。因此,驱动程序的可重试读取逻辑对于健壮的应用程序来说是不够的,您仍然需要在完整迭代级别上处理应用程序中读取错误的可能性。

如果您正在检索单个文档,它通常应该包含在初始查询响应中,并且不需要 getMores,因此在实践中这个问题不适用。

相关问题