首页 > 解决方案 > 如何在 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,因此我们将不胜感激。

标签: node.jsconcurrencymutexsemaphore

解决方案


'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();
    }

推荐阅读