我正在处理一个座位有限的流星预订应用程序。我的应用程序可以同时供许多用户使用,因此有两个用户尝试预订同一座位的可能性。但是根据业务逻辑,席位永远不会被预订满。在Java中,我本可以使用同步块来限制并行预订。我在流星/反应方面没有太多经验,所以不确定要实现此目标的正确方法是什么。
我当前的想法是使用反应性布尔值创建锁,因此,如果应用程序收到两个预订请求,则它将同步处理它们,并导致第二个预订请求失败。由于席位将在第一个请求中分配。但是我担心我是否会陷入僵局。因此,我正在寻求您的意见/帮助以适当的方式实施此操作。
感谢您的建议!
答案 0 :(得分:1)
我假设您的后端是node.js,被视为使用流星,您已经在使用NPM,因此使用Node的后端很有意义。
在这种情况下,假设您使用Express或KOA处理请求,则可以简单地使用promise链接任务,这将强制任务线性执行。
下面是一个简单的工作示例,如果运行该代码段,您会注意到我每700毫秒添加一次任务,但是任务只能在1000毫秒内完成,但是如您所见,没有重叠并且任务按顺序完成
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
let lastTask = Promise.resolve();
async function addTask(txt) {
const ptask = lastTask;
lastTask = (async () => {
await ptask;
console.log(`starting task ${txt}`);
await delay(1000);
console.log(`done task ${txt}`);
})();
}
async function test() {
for (let l = 0; l < 5; l += 1) {
setTimeout(() => {
console.log(`adding task ${l}`);
addTask(l);
}, l * 700);
}
}
test();
答案 1 :(得分:1)
如果您在Meteor中使用pub / sub,则工作已完成。您的预订将按照先到先得的原则进行反应。只要您的连接处于接通状态,当您编写您的第一笔预订时,就可以坐下来。
例如(逻辑写作)
1在所需范围内发布您的预订。
2。在相同范围内订阅客户端。
3。如果存在$ bookedOn美元(预订日期)为“无法预订” /无法点击,则使UX显示必要的颜色/体验。
一本书预订时,所有在平台上在线并查看该组件的用户都将获得更新。
如果您不使用pubs / subs,但很常见,那将是一个“问题”。如果您使用的是Meteor,则应使用Meteor的本机反应性。您的布尔值是Boolean(bookedOn)或只是bookedOn。
答案 2 :(得分:1)
我认为流星方法是调用流星方法,而不是用户占位。 用这种方法检查这个座位是否已经被占用。 更多信息在这里: https://forums.meteor.com/t/if-multiple-users-are-trying-to-access-one-method-of-meteor-methods-how-to-make-method-as-synchronous-to-use-one-user-only-at-a-time/24969/8
但是来自不同客户端的方法在服务器上同时运行。 您将不得不使用信号量之类的东西。最简单的方法是在mongo中写一个锁,然后检查该座位是否不存在该锁。之后,mongo可以使用TTL https://docs.mongodb.com/manual/tutorial/expire-data/
销毁该锁。您可以在https://guide.meteor.com/methods.html
中了解有关方法的更多信息总结起来,伪代码应该是这样的:
accuireLock(userId,seatId); //将读取锁,如果它是自由写入的,则再次读取以防万一。万一失败,它应该抛出错误
takeSeat(userId,seatId);