首页 > 解决方案 > nodejs:在短时间内创造相同的价值

问题描述

我有一个示例应用程序,用户可以通过不同的 URL 访问一些动态数据。

工作流程是这样的:

  1. 当用户请求时get_data?id=1234567
  2. 首先它检查数据库是否有数据
  3. 如果不是,生成一个随机值
  4. 然后如果其他用户在短时间内(比如 10 分钟)请求相同的 url,它将返回已经生成的值
  5. 如果其中一个用户发送清除请求,则该值将从 DB 中清除。

问题是:如果2个用户同时请求同一个url,由于查询DB需要时间,所以会同时做1和2,然后为每个用户创建不同的值。

如何确保在短时间内为所有用户产生相同的价值?

标签: node.js

解决方案


尽管 NodeJS 是单线程的并且不存在多线程之间同步的问题,但它的异步事件模型仍然可以要求您在某些情况下(如您的情况)实现某种锁定机制来同步并发异步操作。

有许多提供此功能的库,例如async-mutex。这是一个非常基本的代码示例:

const express = require('express');
const app = express();
const Mutex = require('async-mutex').Mutex;

const locks = new Map();

app.get('/get_data', async (req, res) => {
    const queryId = req.query.id;
    if (!queryId) {
        // handle empty queryid ...
    }
    if (!locks.has(queryId)) {
        locks.set(queryId, new Mutex());
    }
    const lockRelease = await locks
        .get(queryId)
        .acquire();
    try {
        // do the rest of your logic here
    } catch (error) {
        // handle error
    } finally {
        // always release the lock
        lockRelease();
    }

});


app.listen(4000, function () {
    console.log("Server is running at port 4000");
});

推荐阅读