node.js - 如何在 nodejs 中实现排除控制
问题描述
我正在创建一个聊天应用程序,其中 node.js 服务器计算所有消息的字符数。例如,100 个人发送消息,每个消息的长度为 10,这意味着总字符数为 1000(100 * 10)。如果一个人在此之后发送长度为 10 的消息,则总字符数应为 1010(1000 + 10)。
所有消息都发送到 node.js 服务器,计算其长度并保存在数据库中。
当很多人同时发送消息时,就会出现一个大问题。
当我通过 jMeter在同一时间发送 100 条长度为 10 的消息(如上面的示例)时,总字符数为 120。它应该是精确的 1000!
这是我的代码(节点版本 8.13.0):
'use strict'
const express = require('express');
const router = express.Router();
const co = require('co');
const models = require('models');
const Mutex = require('async-mutex').Mutex;
const CharacterCounter = models.CharacterCounter;
router.get('/message', function (req, res, next) {
co(function* () {
const originalText = req.body.message;
const mutex = new Mutex();
const release = yield mutex.acquire();
let addedCount = 0;
try {
const { currentCount } = yield CharacterCounter.findOne(); // get total character count so far
addedCount = currentCount + originalText.length;
yield CharacterCounter.updateTotalCharacterCount(addedCount); // save on DB
} catch (e) {
console.log(e);
} finally {
release();
}
// ... my code is keep going
似乎这个问题的原因是在互斥库中。但我不知道确切的解决方案。有没有人有实现我的目标的想法?我最近才开始研究 node.js,因此我们将不胜感激。
解决方案
'use strict'
const express = require('express');
const router = express.Router();
const co = require('co');
const models = require('models');
const Mutex = require('async-mutex').Mutex;
const CharacterCounter = models.CharacterCounter;
const mutex = new Mutex();
router.get('/message', function (req, res, next) {
co(function* () {
const originalText = req.body.message;
const release = yield mutex.acquire();
let addedCount = 0;
try {
const { currentCount } = yield CharacterCounter.findOne(); // get total character count so far
addedCount = currentCount + originalText.length;
yield CharacterCounter.updateTotalCharacterCount(addedCount); // save on DB
} catch (e) {
console.log(e);
} finally {
release();
}
推荐阅读
- python - 按下 Enter 时获取 tkinter 列表框选定项,然后关闭
- multithreading - Delphi Parallel For 自定义线程
- react-native - 如何从 react-native 0.57 迁移到 0.60 或更高版本?
- java - 我如何使用java中的客户端服务器套接字编程通过网络流式传输镶木地板文件
- c++ - 在 VM 中运行 GDB 的变量已优化或不可用
- python - 谷歌表格 api 过滤器功能不起作用?
- amazon-web-services - 用于 tensorflow 和 pymysql 的 Sagemaker 内核
- authentication - 如何在 Payara 5.193 中配置数据网格 ttl
- c# - LINQ to Entitites:如何通过谓词获取所有值
- selenium - 在不同的测试环境中使用 Gradle 运行特定的 testNG 测试