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

时间:2018-09-21 20:36:19

标签: javascript mongodb reactjs meteor

我正在处理一个座位有限的流星预订应用程序。我的应用程序可以同时供许多用户使用,因此有两个用户尝试预订同一座位的可能性。但是根据业务逻辑,席位永远不会被预订满。在Java中,我本可以使用同步块来限制并行预订。我在流星/反应方面没有太多经验,所以不确定要实现此目标的正确方法是什么。

我当前的想法是使用反应性布尔值创建锁,因此,如果应用程序收到两个预订请求,则它将同步处理它们,并导致第二个预订请求失败。由于席位将在第一个请求中分配。但是我担心我是否会陷入僵局。因此,我正在寻求您的意见/帮助以适当的方式实施此操作。

感谢您的建议!

3 个答案:

答案 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);