流星反应应用程序的座位预订逻辑



我正在开发一个流星预订应用程序,我的座位数量有限。我的应用程序可以由许多用户并行使用,因此两个用户可能会尝试预订同一座位。但根据业务逻辑,座位永远不会超额预订。在Java中,我可以使用同步块来限制并行预订。我在流星/反应方面没有太多经验,所以不确定实现这一目标的正确方法是什么。

我目前的想法是使用反应式布尔值来创建锁,因此如果应用程序收到两个预订请求,那么它会同步处理它们并使第二个预订请求失败。由于座位已经在第一次请求中分配。但我担心我是否会陷入任何僵局。因此,我正在寻求您的意见/帮助,以适当的方式实施这一点。

感谢您的建议!

我假设这里的后端是node.js,被视为您使用的meteor,您已经在使用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();

如果你在Meteor中使用pub/sub,工作就完成了。您的预订以先到先得的方式提供。只要您的转机处于打开状态,当您写下第一个预订时,座位就会被占用。

例如(逻辑写作(

1 在所需范围内发布您的预订。

2.在同一范围内的客户端上订阅。

3.如果预订的文件在$exists(预订日期(上显示"不可预订"/不可点击,则使UX显示必要的颜色/体验。

当一个人预订它时,平台上的所有用户在线并查看该组件都将获得更新。

如果您不使用酒吧/订阅但很常见,那将是一个有点"问题"......你在流星上,你应该使用流星的原生反应性。您的布尔值是布尔值(bookedOn(或刚刚预订。

我认为流星的方法就是调用流星方法,比用户占用一个座位。 在此方法中,检查此座位是否已被占用。 更多信息在这里: 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 中写一个锁,并检查这个座位的锁是否不存在。之后锁可以用TTL https://docs.mongodb.com/manual/tutorial/expire-data/被蒙戈摧毁

您可以在此处阅读有关方法的更多信息 https://guide.meteor.com/methods.html

总结一下,伪代码是这样的:

accuireLock(userId, seatId(;//将读取 lock,如果它是自由写入它,然后再次读取以防万一。在任何失败中,它应该抛出错误

takeSeat(userId, seatId(;

最新更新