使用mongo-go-driver迭代游标遇BSON解码错误,如何重试获取文档?
迭代Mongo游标时处理随机BSON解码错误(基于mongo-go-driver v1.15.0)
更新: 现已确认该问题由网络问题导致,即存在故障的负载均衡器会随机传输不完整的BSON字符串,目前已通过修复负载均衡器解决问题。
在使用mongo-go-driver v1.15.0迭代Mongo集合时,执行cursor.Decode操作会随机出现BSON解码错误,例如error decoding key accoun: EOF。注意该键的实际名称为account_id,推测是网络问题导致BSON数据未完整传输。
由于无法控制当前环境的网络,但拥有应用程序的控制权,为确保应用每次都能成功运行,唯一可行的方案似乎是在遇到此类错误时进行重试,直至底层问题解决。
更新:无法选择重启整个迭代流程,因为底层网络问题在下次尝试时仍会出现。
核心代码如下:
cursor, err := db.Collection(`c`).Find(context.TODO(), bson.D{}) Check(err) defer cursor.Close(context.TODO()) for cursor.Next(context.TODO()) { var doc bson.M err := cursor.Decode(&doc) Check(err) // 此处有时会因解码错误失败 // 处理结果逻辑 }
mongo-go-driver中的游标会批量获取文档,因此如果cursor.Decode()失败,单纯重试解码并无帮助,因为当前批次的文档已不完整。
需要重新获取并替换出现问题的文档,请问在mongo-go-driver中是否有实现此功能的方法,以缓解迭代Mongo游标时的随机网络问题?
期望的实现逻辑大致如下:
err := cursor.Decode(&doc) if (err) { cursor.RetryDocument() continue }
内容的提问来源于stack exchange,提问作者sebastian
相关产品推荐
相关产品推荐

