【问题标题】:Need help with the architecture for a penny bidding website需要一分钱投标网站的架构方面的帮助
【发布时间】:2011-11-21 14:01:08
【问题描述】:

我正在尝试创建一个类似于BidCactusLanceLivre 的网站。

我遇到问题的具体部分是计时器的秒数。

拍卖开始时,15秒的计时器开始倒计时,每次有人出价,计时器就会重置,物品的价格会增加0.01美元。

我已经尝试将 SignalR 用于这一点,虽然它在办公室的试验中运行良好,但它对于秒数的实际使用来说还不够好。当太多用户在网站上出价和闲置时,我会收到 HTTP 503 错误。

如何让客户端的计时器显示正确的剩余时间?

HTTP 每秒使用 AJAX 获取该信息是否允许我正确显示丢失的时间?这是每秒一个请求!

不仅如此,当用户请求 GET 时,我会计算剩余秒数,但在用户看到该响应之前,该时间不再有用,因为在处理和返回之间可能会经过一秒或更多秒。你明白我的难题了吗?

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: c# asp.net architecture


    【解决方案1】:

    您描述的解决方案存在几个问题:

    1. 非常浪费。互联网上的每台计算机都已经内置了一个相当高精度的时钟。
    2. Internet 总是有延迟。当数据包到达客户端时,它就会变旧。
    3. Internet 是一个可变延迟网络,因此您获得的时间更新数据包对于一个数据包可能会延迟一秒或多于一秒,而对于另一个数据包可能会延迟低至 20 毫秒。

    处理#2和#3需要复杂的算法。

    如果你确实需要秒级精度

    现有的互联网标准软件可以解决这个问题 - Network Time Protocol

    使用真正的 NTP 客户端(不是 Windows 内置的 -it only guarantees it will be accurate to within a couple seconds)将您的服务器与国家标准 NTP 服务器同步,并在您的应用程序中构建一个真正的 NTP 客户端。定期同步服务器上的时间,并定期同步客户端上的时间(可能是每次他们登录/连接时?可能是每小时一次?)。然后只需使用系统时钟进行时间计算。

    不要尝试同步客户端的系统时间 - 他们可能无权这样做,当然也不能通过浏览器进行。相反,您可以获得相对于系统时间的参考时间,并简单地将差异添加为客户端计算的偏移量。

    如果您实际上不需要二级精度

    您可能真的不需要在一秒钟内保证准确性。

    如果你做出这个决定,你可以稍微简化一下。只需将每次拍卖的相对完成时间发送给客户,而不是绝对时间。每隔一段时间(例如每分钟)在客户端重新请求它。他们的全球系统时间可能不同步,但他们时钟上的秒针应该非常准确地记秒。

    如果您想让它更流畅一些,您可以尝试确定每次调用服务器的(相对)延迟。跟踪对服务器的调用之间经过了多少时间,以及上一次调用的剩余时间值。比较它们。然后,计算较小的那个,并根据该计算得出新的时间。

    不过,在设计这样的解决方案时我会小心。如果您计算错误,或者正在处理不准确的系统时钟,您可能会破坏您的整个同步模型,或者无意中导致客户端更喜欢 higest 延迟调用。如果您编写此代码的“光滑”版本,请确保考虑所有情况:)

    【讨论】:

      【解决方案2】:

      获得真正良好的实时通信的一种方法是打开从浏览器到您在服务器上编写的特殊 tcp/ip 套接字服务器的连接。这就是网络上很多聊天包的工作原理。

      双工套接字允许您双向推送数据。因为连接已经打开,你可以发送相当快的数据。

      过去,您需要使用 Adob​​e Flash 来完成此操作。我不确定浏览器是否已经足够先进,可以在没有插件的情况下处理这个问题(例如,websockets?)

      另一种值得研究的方法是长轮询。从概念上讲,与服务器建立的连接不会中断,它使您有机会在服务器上将实时数据滴到客户端。

      只是一些指针。我使用JavaScript <-> Flash <-> Python/PHP 编写了网络软件,并且对它的工作方式感到满意。

      祝你好运。

      【讨论】:

      • 目前仅勉强支持 Web 套接字。我很确定它们还没有任何官方标准。但是支持服务器 -> 客户端推送的现有模型是the Comet model。由于这使连接保持打开状态,因此它可能会给出 OP 正在寻找的延迟下降类型。 编辑 哦,在你的答案中掩盖了“长轮询”。同样的事情;)
      • 此时我对使用 WebSockets 犹豫不决。我提到我使用了 SignalR(它使用长轮询),但它没有按预期工作。如果有很多用户在线,则会出现大量 HTTP 503 错误。
      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2013-02-24
      • 2018-10-27
      • 1970-01-01
      • 2017-06-10
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多