python - AsyncIOMotorCommandCursor.fetch_next 是否会阻止可重试读取?
问题描述
我正在尝试在 Mongo Atlas 集群故障转移期间诊断电机读取故障。Retryable-Reads 规范定义aggregate
调用是可重试的,但Cursor.getMore
不是。我的代码如下所示:
cursor = db.foo.aggregate([...])
if not await cursor.fetch_next:
raise SomeException
doc = cursor.next_object()
此代码似乎不会在集群故障转移期间重试,因为它在内部调用getMore
我假设。我不完全清楚是否是这种情况。更不用说fetch_next
无论如何都已弃用。
将其更改为可重试读取?
async for doc in cursor:
break
else:
raise SomeException
还是这会导致相同的内部处理,而问题出在其他地方?
目标是尝试以可重试的方式从聚合管道(有一个或没有)读取单个结果文档,如果没有则引发异常。
解决方案
您需要挽救驱动程序在此代码之外的网络错误引发的任何异常,并在这种情况下重复整个迭代。
驱动程序会自动重试初始查询,但不会重试 getMores,因为它们无法指定结果集中的位置。因此,驱动程序的可重试读取逻辑对于健壮的应用程序来说是不够的,您仍然需要在完整迭代的级别上处理应用程序中读取错误的可能性。
如果您正在检索单个文档,它通常应该包含在初始查询响应中,并且不需要 getMores,因此实际上这个问题不适用。
推荐阅读
- typescript - TypeScript 字段的类型取决于另一个字段的类型
- c++ - Try-Catch std::bad_alloc 外部函数?
- html - SVG 动画在 Firefox 和 Safari 上不起作用
- vue.js - 将数据从子组件传递给父组件,然后再传递给另一个子组件,该子组件不处理页面加载,但在可能不相关的微小更改后工作
- c - 使用 getchar() 将字符串文字的地址存储在 char*pointer 中
- javascript - 我在我的三个 js 项目中实现程序地形生成时遇到问题
- javascript - webpack:我在终端 vscode 中遇到问题
- java - XML 文件。如何在 Spring 中解析 XML 文件
- c++ - 我在我的 .h 文件中包含了 StlLock.h 并得到了这些错误
- r - 两行第二行和最后一行之间的日期差异