8

我将尝试使用 Angular JS 为特定的利基市场建立一个便士拍卖网站。我正在尝试计划倒数计时器,并且我一直渴望尝试使用 firebase。

昨天我的想法是让每次拍卖以某种方式在实际数据库中进行倒计时,因为使用 2 路数据绑定,人们的客户端将始终保持更新。

当 firebase 发生变化时,所有连接的客户端都会立即发生变化。所以我的问题是......我如何在特定记录中进行服务器端倒计时。

假设我有一个项目 x 的记录,它包含所有项目信息,并且数组键之一是“倒计时:59:01:00”。在服务器端从 59:01:00 倒计时到 00:00:00 的一种现实且可扩展的方式是什么?

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

有什么好主意吗?

4

2 回答 2

11

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));
}

最有可能的是,您希望服务器负责计时器的原因是让它“公平”。但这不合逻辑。如果每个用户都将自己的“代码”保留到结束时间,并且开始/结束时间是固定的,那么这里就没有什么可以破解的了。

于 2014-08-04T14:48:18.520 回答
1

我正在处理与您类似的问题。

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

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

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

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

users_current_time: TIMESTAMP_PLACEHOLDER

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

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

我仍然会推荐一些服务器来做所有的家务和计算倒计时。

于 2014-07-31T10:38:23.950 回答