我正在开发一个用于通过Http请求发送SMS的API。我使用节点js和mongoose。所以我遇到了一个像多线程应用程序那样的问题。
事实是,当用户发送短信时,我验证他已经在数据库中发送的短信数量(使用猫鼬),如果数字没有超过限制,他的短信被发送,短信的数量是已发送数据库中的增量(他在模式中的小时,日,周和月中发送的短信数量值)。但事实是我在代码中使用了一个回调来读取值和增量值以及许多其他操作。
所以问题(我认为)是当用户非常快速地发送请求时,服务器不同的回调读取相同的发送短信数,授权用户发送短信,增加并保存相同的值,以便短信的数量是假的。
在一个访问变量的多线程应用程序中,解决方案是阻止其他线程在实际线程完成所有操作之前读取变量。
使用Node js事件系统和访问mongoDB中的数据我只是不知道如何解决我的问题。
提前感谢您的回答。
PS:我不知道解决方案,但如果它也适用于允许节点j使用多核的集群,那将会很好。
答案 0 :(得分:0)
感谢Cristy,我使用async queue解决了问题的主要部分。
当我以节点js的默认方式运行它时,我的应用程序运行良好。 但还有另一个问题。我打算在具有4个内核的服务器上运行我的代码,因此我想使用节点集群模块。但是当我使用这个...因为它运行代码像4个不同的进程(我使用了4个内核的服务器)他们使用不同的队列和我之前提到的错误总是发生,他们读取和写入数据库而无需等待其他线程完成处理验证+更新。
所以我想知道如何才能拥有最佳和快速的应用程序。 我应该停止使用群集模块而不是多核服务器的好处(我不认为这是最好的答案)? 我应该将它存储在我的mongodb中(可能会尝试不保留队列但是将其存储在内存中以使其更快)? 当我使用集群时,有没有办法在代码中共享队列?
我最好的选择是什么?
答案 1 :(得分:0)
我认为你应该尝试一些缓存方法。 现在我和你遇到同样的情况。 我将尝试使用缓存来存储正在进行的record_id。 当新请求到来时,即将到来的进程需要检查缓存。如果record_id在缓存中,则表示该记录正被其他线程使用。所以线程需要等待或做其他事情直到完成。当进程完成时将删除回调函数中缓存中的record_id