MongoDB 并发问题

标签 mongodb concurrency locking nosql

我的应用程序有一个类似于在 Facebook 中发送好友请求的场景。

当用户 A 向用户 B 发送好友请求时,内部会创建一个新的好友请求文档。稍后当用户B也想向A发送好友请求时,系统会发现已经存在好友请求文档,因此他们应该是彼此的好友,不会创建新的好友请求文档。

我试图弄清楚当用户 A 和用户 B 同时向对方发送好友请求时的情况,这将创建 2 个好友请求文档并导致不确定的行为......

感谢您的建议..非常感谢!

编辑: 一些人建议使用请求队列来解决这个问题;然而, 我对使用队列感到困惑,因为我认为它会让我的其余 api 端点按顺序处理请求。使用队列不会失去多线程的所有好处吗?我不禁想象,如果我的服务因为这个问题而有数百万个请求排队等待一一执行,那该多糟糕。有没有人在生产中看到过类似的问题?

最佳答案

我的客户端也有类似的情况,它在数据库中有并发写入,我实现的是队列服务。

Create a request in the queue rather than writing in the database, a separate reader will 
read one message from the queue at a time and check if it is valid to write it to 
database, write only if there is no previous request.

您可以实现自己的队列,也可以使用 AWS-SQS、rabbitmq、MSMQ 等服务。

关于MongoDB 并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348231/

相关文章:

java - 为什么 Clojure 用未检查的异常包装已检查的异常?

c# - 防止线程不必要地执行 CoSTLy 任务

postgresql - 使用 EXCEPT 集合运算符时如何编写 Postgres SELECT FOR UPDATE?

c# - 锁定代码区域的正确方法是什么

C# 锁定语句

mongodb - 为其他字段的计数创建新字段

node.js - 在 cmd 和本地主机 "createError is not defined"上得到这个输出

google-app-engine - 有人在 Google App Engine 上尝试过 MongoDB 吗?

javascript - 连接 MongoDB Native Driver Node JS 的正确方法

c# - 改变并发模式