2011-09-21 41 views
2

我試圖創建一個類似於BidCactusLanceLivre網站。需要幫助的架構一分錢招標網

我遇到的具體部分是定時器的秒級方面。

當拍賣開始,15秒計時器開始倒計時,每一次一個人的出價,計時器被複位,該項目的價格提高了0.01 $。

我一直在使用SignalR該位嘗試,雖然它在試驗中很好地工作在辦公室運行時,它只是不適合現實世界中使用,其中秒計數不夠好。如果有太多的用戶在網站上出價和閒置,我會得到HTTP 503錯誤。

如何讓客戶端上的計時器顯示正確的剩餘時間?

HTTP會每秒通過AJAX獲取該信息是否允許我正確顯示缺失的時間?這是每秒的要求!

不僅如此,而且當用戶請求GET時,我計算剩餘秒數,但在用戶看到該響應之前,該時間不再有用,因爲第二個或更多可能在處理和返回之間傳遞。你看到我的難題嗎?

有關如何解決此問題的任何建議?

回答

0

有幾個問題,你描述的解決方案:

  1. 這是非常浪費的。互聯網上的每臺計算機都有一個相當高精度的時鐘。
  2. 互聯網總是有延遲。當數據包到達客戶端時,它會變老。
  3. 互聯網是一個可變延遲網絡,因此您獲得的時間更新數據包對於一個數據包可能高於或低於一秒,對於另一個數據包低至低於20毫秒。

它需要複雜的算法來處理#2,#3。

如果實際上需要第二級的精度

還有就是現有的互聯網標準的軟件解決它 - Network Time Protocol

使用真正的NTP客戶端(不是Windows內置的客戶端 - it only guarantees it will be accurate to within a couple seconds)將服務器與國家標準NTP服務器同步,並在應用程序中構建真正的NTP客戶端。定期在服務器上同步時間,並定期同步客戶端上的時間(可能每次登錄/連接時,可能每隔一小時?)。然後只需使用系統時鐘進行時間計算。

不要嘗試同步客戶端的系統時間 - 他們可能無法訪問,當然也不能從瀏覽器訪問。相反,您可以獲得相對於系統時間的參考時間,並將差異作爲客戶端計算的偏移量添加。

如果你實際上並不需要第二級的精度

你可能不是真的需要一秒鐘內保證精度。

如果你做出這個決定,你可以簡化一下。只需將每個拍賣的相對於完成時間發送給客戶,而不是絕對時間。每隔一段時間(如每分鐘)在客戶端重新提出請求。他們的全球系統時間可能不同步,但他們的時鐘二手應該相當精確地打勾秒鐘。

如果您想讓這個更加光滑一點,您可以嘗試確定每次到服務器的呼叫的(相對)延遲。跟蹤服務器調用之間經過了多少時間,以及前一次調用的時間剩餘值。比較它們。然後,計算哪一個更小,然後根據這個計算得出新的時間。

雖然,在設計這樣的解決方案時我會小心謹慎。如果計算錯誤或者處理不準確的系統時鐘,則可能會破壞整個同步模型,或者無意中導致客戶更喜歡延遲呼叫。如果你寫這個代碼的「光滑」版本,請確保你解釋了所有的情況:)

0

一種方式得到非常好的實時通信是打開從瀏覽器到你的服務器上寫一個特殊的TCP/IP套接字服務器的連接。這就是網上很多聊天包的工作原理。

雙工套接字允許您向兩個方向推送數據。由於連接已經打開,您可以發送相當多的非常快速的數據。

過去,您需要使用Adobe Flash來完成此操作。我不知道,如果瀏覽器已經足夠先進來處理這個無需插件(例如,WebSockets的?)

另一種方法值得看的是長輪詢。在概念上,與服務器建立連接並不會死亡,它使您有機會在服務器上將實時數據的一部分緩存到客戶端。

只是一些指針。我已經使用JavaScript <-> Flash <-> Python/PHP編寫了網絡軟件,並請它如何工作。

祝你好運。

+0

Web套接字在這一點上只能得到很少的支持。我很確定他們還沒有任何官方標準。但是支持服務器 - >客戶端推送的現有模型是[Comet模型](http://en.wikipedia.org/wiki/Comet_(programming))。由於這會保持連接打開,所以可能會導致OP尋找的延遲類型。 *編輯*哦,在你的回答中掩蓋了「長時間輪詢」。同樣的事情;) –

+0

我在此時猶豫使用WebSockets。我提到我使用了SignalR(它使用長輪詢),它不能按預期工作。如果很多用戶在線,HTTP 503錯誤的總數會很多。 –