MongoDB并发问题

时间:2015-12-18 03:44:11

标签: mongodb concurrency locking nosql

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

当用户A向用户B发送好友请求时,会在内部创建新好友请求文档。在用户B也想要向A发送好友请求的时候,系统会发现好友请求文件存在,所以他们应该是对方的朋友,不会创建新的好友请求文件。

我试图找出用户A和用户B同时向对方发送好友请求然后创建2个好友请求文档并导致未确定行为的情况......

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

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

3 个答案:

答案 0 :(得分:4)

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

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等服务。

答案 1 :(得分:3)

//特定于您的案例

  1. 在mongodb中,对单个文档的写操作是原子的。
  2. mongodb具有独特索引的功能。
  3. 因此,如果您通过为人员名称A和B插入带有人名称A和B的文档(例如" A_B"通过按字母顺序排序名称),然后再进行操作插入。您本身只能插入该文档的一个实例。

    //一般

    基本上我们想要的是交易,但是因为mongodb目前还不支持这样的交易。有一些技巧可以达到这个目的:

    1. 2阶段提交: https://docs.mongodb.org/v3.0/tutorial/perform-two-phase-commits/

    2. 使用外部源来维护标志,例如使用支持以事务方式插入的memcache /比较和交换。

答案 2 :(得分:2)

如果您在前端使用系统调用方法,那么当某些用户喜欢时,您应该从数据库中向前端发出一个请求,我发送请求然后在一秒数据库中发送一个系统调用并且您的前端代码立即纠正按钮文本,如

  

“添加好友”到“来电请求”

或者。

如果您只是设置数据库,那么只需进行系统调用,当朋友请求到达时将其发送到UI,或者如您所说的创建文档,进一步的过程将由UI Developer处理。 谢谢。 如果你不喜欢这个答案,那么我为此道歉,但不要贬低我,因为我是Stack Overflow社区的新人。