我们正在尝试使用 更新文档updateOne()。过滤器识别文档,我们使用 更新文档的属性$set。此更新作业每分钟由一个 cron 作业触发。
说,原始文件是{_id: "USER1001", status: "INACTIVE"}. 我们通过updateOne()使用过滤器调用{_id: "USER1001", status: "INACTIVE"}并将状态字段更新为来更新它{"$set":{status:"ACTIVE"}}。我们查看结果值modifiedCount并期望它为 1,以声明updateOne()操作成功。然后这会触发下游作业。
该应用程序在 Kubernetes 中运行,我们已经对其进行了扩展。当我们在负载下测试系统时updateOne(),会从两个不同的 Pod 使用相同的过滤器同时调用同一个文档,并且都返回modifiedCount1。
我们期望modifiedCount1 对应一个 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] [调试] [myJob-7dc8b78bcf-jd7m8] update() :: 更新结果 :: USER1001 / Matched=1 / Modified=1
这里的问题是——
有没有其他人看到过这种行为?
什么可能导致此问题?
附加信息,
该应用程序在 Go 中
Mongo 是 4.4 和
我们正在使用最新的 mongo-driver 进行 go。
cron 作业每分钟运行一次,而不是一分钟。意思就是,
10:00:35
10:01:35
10:02:35 等
10:00:23
10:01:23
10:02:23 等
POD-1 可能会运行它,
POD-2 可能会运行它,
慕田峪7331174
互换的青春
相关分类