Google应用引擎:同步所有服务器'时间和客户'javascript计时器

Google app engine: sync all servers' time and clients' javascript timers

本文关键字:时间 客户 计时器 javascript 服务器 引擎 应用 同步 Google      更新时间:2023-09-26

我正在开发谷歌应用程序引擎与Python投标系统。产品在预定时间开启竞价,竞价时间为3分钟。在3分钟的时间内,产品的价格每秒钟下降一个常数,直到为零。谁先按"投标"键,谁即中标。这个应用程序中的一个关键问题是,所有用户之间的时间应该完全同步,以便每个人在同一时间看到相同的价格。以下是我到目前为止所得到的,但它受到计时器不准确的影响。

当用户访问或刷新页面时,Python代码将服务器时间传递给javascript计时器,计时器开始倒计时。简化后的javascript代码如下:

var count = {{timeToBid}};  // 'timeToBid' is in seconds and is inserted by the template engine
var price =={{initialPrice}}  // The initial product price
var currentPrice;             // Current price
function updateTime() {
  timeStr = ...;    // Set the time string to be HH:MM:SS
  $("#timeToBid").html(timeStr);   // Display time in the 'timeToBid' div
  if (count <= 180) {    // Start bidding
    currentPrice =  ...;  // Calculate the current price  
    $("#currentPrice").html(currentPrice);  // Update current price
  }
  count--;
  setTimeout(updateTime, 1000);  // Executed every second
}
updateTime();

上面的javascript受到用户浏览器之间不同步计时器以及服务器时间不同步的严重影响(参见此)。每个浏览器中显示的当前价格可能相差很大,这使得系统完全无法使用。这是一个相当复杂的问题,我要求有好的解决办法。一到两秒的时间误差是可以接受的。我的问题:

(a)为了使javascript计时器更准确,我计划使用AJAX每10秒检索服务器时间,然后更新'count'。这是一个好的解决方案吗?还是有其他选择?

$.ajax({
   url: "/getServerTime",
   cache: false,
   success: function(serverCount) {
     count = parseInt(serverCount);
     return false;
   }
});

(b)我完全不知道如何解决服务器时间不一致的问题。有人能帮忙吗?谢谢。

App Engine服务器上的系统时钟保持同步:参见此权威答案。

每个应用引擎HTTP响应都有一个Date标头,就像这个Date: Wed, 24 Apr 2013 06:03:37 GMT。您可以使用它来同步浏览器和服务器时间。