2017-08-01 93 views
0

读/写并发我开发一个HTTP请求发送短信的API。我使用节点js和猫鼬。所以我有一个像多线程应用程序一样的问题。节点JS与猫鼬/ MongoDB的

事实是,当用户发送短信时,我会验证他已经发送到数据库(使用猫鼬)的短信数量,如果该数字没有超过限制,他的短信将被发送,短信数量他发送的是数据库中的增量(在模式中,他在小时,天,周和月中发送的短信数量有一个值)。但事实是,我在我的代码中使用了一个回调函数来读取值和增量值以及许多其他操作。

因此,问题(我认为)是,当用户发送请求非常快时,服务器不同的回调读取相同数量的短信发送,授权用户发送短信,增加和保存相同的值,以便计数的短信是错误的。

在一个访问变量的多线程应用程序中,解决方案将阻止其他线程在实际线程完成所有工作之前读取一个变量。

随着节点的js事件系统,并获得MongoDB中的数据我只是不知道如何解决我的问题。

预先感谢您的答案。

PS:我不知道解决方案,但它会很好,如果它也适用于允许节点js使用多核的群集。

+0

您可以将消息添加到队列中,并且仅在处理完前一个消息后才处理下一个消息。 – Cristy

+0

此外,请阅读:https://docs.mongodb.com/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use – Cristy

回答

0

感谢CRISTY,我已经解决了使用async queue我的问题的主要部分。

我的应用效果很好,当我运行它节点JS的默认方式。 但还有一个其他问题。我打算在具有4个内核的服务器上运行我的代码,因此我想使用节点集群模块。但是当我使用这个...因为它运行的代码像4个不同的进程(我使用了一个有4个内核的服务器),它们使用不同的队列,并且我之前提到的错误总是发生,它们读取和写入数据库而不等待其他线程完成处理验证+更新。

所以我想知道我应该怎么做才能有一个最佳的和快速的应用。 我是否应该停止使用集群模块并且不要利用多核服务器(我不认为这是最佳答案)? 我应该将它存储在我的mongodb中(也许尝试不保留队列,但将其存储在其他存储器中以使其更快)? 当我使用集群时,有没有办法在代码中共享队列?

我最好的选择是什么?

0

我认为你应该尝试一些缓存方法。现在我遇到了和你一样的情况。 我将尝试使用缓存来存储正在处理的record_id。 当新请求到来时,即将到来的进程需要检查缓存。如果record_id在缓存中,则意味着该记录正在被其他线程使用。所以这个线程需要等待或者做其他的事情,直到完成。当过程完成时将删除回调函数中缓存中的record_id

+0

感谢您的答复...我不知道我该如何做到这一点...我可以有一个代码片段? – Sekki