node.js - nodejs:在短时间内创造相同的价值
问题描述
我有一个示例应用程序,用户可以通过不同的 URL 访问一些动态数据。
工作流程是这样的:
- 当用户请求时
get_data?id=1234567
- 首先它检查数据库是否有数据
- 如果不是,生成一个随机值
- 然后如果其他用户在短时间内(比如 10 分钟)请求相同的 url,它将返回已经生成的值
- 如果其中一个用户发送清除请求,则该值将从 DB 中清除。
问题是:如果2个用户同时请求同一个url,由于查询DB需要时间,所以会同时做1和2,然后为每个用户创建不同的值。
如何确保在短时间内为所有用户产生相同的价值?
解决方案
尽管 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");
});
推荐阅读
- java - Spring boot - 多个数据源无法配置数据源url
- python - ModuleNotFoundError:没有名为“django_plotly_dash”的模块
- reactjs - 如何使用数组作为 React 钩子的依赖项
- node.js - TypeScript Ghostscript 导入更改为 gs_
- html - 引导日期选择器不显示日期选项
- azure - 数据从 Azure 传输到 Snowflake 时使用什么加密?
- c - 使用 strsep 的分段错误
- html - 当一个元素到达另一个元素的边缘时将其隐藏在屏幕之外
- python - Networkx 不可散列类型:'dict'
- javascript - Mongoose 获取有条件的字段