Firebase倒数计时器在多个客户端同步

Dan*_*ite 6 javascript node.js 2-way-object-databinding angularjs firebase

我将采用角度JS来为一个特定的利基建立一个便士拍卖网站.我正在尝试计划倒数计时器,我一直在寻找试用firebase的理由.

我昨天想到让每次拍卖都以某种方式在实际数据库中进行倒计时,因为通过双向数据绑定,人们将始终保持更新.

当firebase更改时,所有连接的客户端立即更改.所以我的问题是......我怎样才能在特定记录中进行服务器端倒计时.

所以说我有一个项目x的记录,它有所有项目信息,其中一个数组键是"倒计时:59:01:00".什么是在SERVER端从59:01:00到00:00:00倒计时的现实和可扩展的方式.

我想也许是每1秒运行一次的cronjob?但随后数百个数据库条目每秒运行数百个倒计时,服务器可能会崩溃.

有什么好主意吗?

Kat*_*ato 8

Firebase确实可以每秒处理数百个数据库操作(实际上更多).但这将大大过度设计.

而不是运行在服务器上每秒更新的计时器,只需存储事件的开始/停止时间,并允许客户端管理自己的计时器.这不应该通过每秒递减1来完成(因为setInterval和其他客户端工具不是非常精确),而是通过将当前时间戳与结束进行比较,并确定差异.

timeout = setInterval(countDown, 1000);
function countDown() {
    setTime(Math.max(0, endsAt - Date.now()));
    if( endsAt <= Date.now() ) { clearInterval(timeout); }
}

function setTime(remaining) {
    var minutes = Math.floor(remaining / 60000);
    var seconds = Math.round(remaining / 1000);
    $('#timer').text(lpad(minutes) + ':' + lpad(seconds));
}
Run Code Online (Sandbox Code Playgroud)

最有可能的是,您希望服务器负责计时器的原因是让它"公平".但这不符合逻辑.如果每个用户保持自己的"股票"下调至结束时间,和开始/结束时间是固定的,没有什么在这里砍.


web*_*vet 1

我正在处理和你类似的问题。

第一个问题是没有服务器端代码。Firebase 是数据存储,您必须实现的任何逻辑都需要分为数据库设计和客户端代码。

第二个问题,如果数据库中的实际时间戳字段没有改变,如何让客户端监听从未来到过去的时间戳变化。

客户端始终可以通过推送时间戳占位符并监听更改来询问当前服务器时间。

auction:{
  countdown:{
    ends_in: NUMBER_IN_MLS,
    start_time: TIME_STAMP
  }
}

users_current_time: TIMESTAMP_PLACEHOLDER
Run Code Online (Sandbox Code Playgroud)

如果用户启动应用程序并希望查看当前拍卖,则立即拉动当前服务器时间,并且客户端的计时器从 0 开始。 - 每次用户上线时都可以重复此操作。现在,当用户发起拍卖时,他将获得拍卖开始的时间和持续时间。您还可以获得当前服务器时间和在线时间。这将为您提供有关剩余时间的相当准确的信息。

第三个问题:我更关心的是安全性。时间一到,拍卖就应该关闭,但是只有 firebase 作为后端,所有客户仍然拥有提交出价的写入权限。

我仍然会推荐一些服务器来完成所有的内务管理和计算倒计时。