【发布时间】:2020-11-21 10:51:39
【问题描述】:
我们正在尝试使用updateOne() 更新文档。过滤器识别文档,我们使用$set 更新文档的属性。此更新作业每分钟由一个 cron 作业触发。
说,原始文件是{_id: "USER1001", status: "INACTIVE"}。我们通过使用过滤器{_id: "USER1001", status: "INACTIVE"} 调用updateOne() 并将状态字段更新为{"$set":{status:"ACTIVE"}} 来更新它。我们查看modifiedCount 的结果值并期望它为1,以声称updateOne() 操作成功。这会触发下游作业。
应用程序在 Kubernetes 中运行,我们已经对其进行了扩展。当我们在负载下测试系统时,从两个不同的 pod 对具有相同过滤器的同一个文档同时进行两个 updateOne() 调用,并且都将 modifiedCount 返回为 1。
我们希望modifiedCount 为 1 对应一个 pod,0 对应另一个。但对于某些文档,我们会看到此结果。
示例代码供参考
// cron job that calls update() every minute
func update(){
filter := bson.D{{"_id", "USER1001"}, {"status", "INACTIVE"}}
result, err := collection.UpdateOne(context.Background(), filter, bson.M{"$set": bson.M{"status": "ACTIVE"}})
if result.ModifiedCount != 1 {
// no update done
} else {
// call downstream jobs
}
}
我们从应用程序 pod 中获得的示例日志行
- POD-1
[2020-11-20 17:30:58.610518875 +0000 UTC] [DEBUG] [myJob-7dc8b78bcf-c4677] update() :: 更新结果 :: USER1001 / Matched=1 / Modified=1
- POD-2
[2020-11-20 17:30:58.409843674 +0000 UTC] [DEBUG] [myJob-7dc8b78bcf-jd7m8] update() :: 更新结果 :: USER1001 / Matched=1 / Modified=1
这里的问题是 -
- 有其他人看到过这种行为吗?
- 什么可能导致此问题?
其他信息,
- 应用程序在 Go 中
- Mongo 是 4.4 并且
- 我们正在使用最新的 mongo-driver for go。
- cron 作业每分钟运行一次,而不是在一分钟内运行。意思就是,
- POD-1 可能会运行它,
- 10:00:23
- 10:01:23
- 10:02:23 等
- POD-2 可能会运行它,
- 10:00:35
- 10:01:35
- 10:02:35 等
- POD-1 可能会运行它,
【问题讨论】:
-
鉴于赞成的答案,您应该提供一个演示问题的程序。
-
当然。我已经用我们的应用程序、日志和其他信息中的示例代码更新了问题。
-
我认为,如果您真的希望有人为您调查此问题,您需要提供一个完整的程序来重现该问题。
-
结束这个问题,因为这是代码中根深蒂固的竞争条件。
标签: mongodb go kubernetes