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

我将采取一个尖锐的JSbuild立一个便士拍卖网站为特定的利基裂缝。 我试图计划倒计时计时器,我一直渴望有一个尝试firebase的理由。

我昨天有个想法,让每次拍卖在实际的数据库中都有一个倒计时,因为使用双向数据绑定,客户端将始终保持更新。

当火力点发生变化时,所有连接的客户端立即改变。 所以我的问题是这样的…我怎么能做一个特定的logging内的服务器端倒计时。

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

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

任何好主意?

Firebase确实可以每秒处理数百个数据库操作(实际上更多)。 但是这会大大过度devise。

只需存储事件的开始/停止时间,并允许客户端pipe理自己的定时器,而不是运行每秒更新一次的定时器。 这不应该通过每秒递减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)); } 

最有可能的是,你希望服务器负责定时器的原因是使其“公平”。 但是这不合逻辑。 如果每个用户保留自己的“股票代码”到结束时间,并且开始/结束时间是固定的,那么在这里没有任何东西可以破解。

我正在处理类似的问题。

第一个问题是没有服务器端代码。 Firebase是数据存储,无论您需要实现什么逻辑,都需要分为数据库devise和客户端代码。

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

客户端总是可以通过推送时间戳占位符并聆听更改来请求当前的服务器时间。

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

如果用户在应用程序上启动并希望查看当前拍卖,则立即拉取当前服务器时间,客户端上的定时器从0开始。 – 每次用户上线时,都可以重复此操作。 现在,当用户拉开拍卖时,他会得到开始的时间和持续时间。 您还拥有当前的服务器时间和在线时间。 这应该给你相当准确的信息,剩下多less时间。

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

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