2010-09-16 51 views
0

我正在開發一個功能,我需要在兩個用戶之間存儲特定系列操作的狀態,就像基於ajax的聊天服務一樣。在哪裏存儲服務器上的狀態

該場景如下: 用戶可以看到哪些其他用戶在線,然後挑戰其中一個用戶。另一個用戶接收挑戰並接受它。現在,每個用戶都有5個問題,並且匹配爲他們同時開始(幾乎同時)。然後,當用戶瀏覽問題或解決問題時,狀態也會在其他用戶屏幕上更新。

本質上,這與聊天系統非常相似,如說facebook聊天。我能夠看到所有人都在線。我向我的朋友發送聊天消息,然後我的朋友可以回覆該消息,並在我的聊天窗口中看到該消息。

我相信所有這些都可以通過使用ajax來實現。我可以輕鬆地對.asmx webservices進行ajax調用,併爲特定用戶檢索對象,因爲Session可以在那裏訪問。但是,我想知道在哪裏維護狀態,因爲會話是針對特定用戶的,我希望我的特定對象可供兩個特定用戶訪問。

我在哪裏存儲狀態?或者以Ajax聊天爲例,我應該在哪裏存儲User1輸入的信息,以及Uer1輸入的內容如何顯示給user2?

我在想應用程序對象,但讀取它不被推薦。

你對這樣的事情有何建議?

回答

1

如果你想做「接近實時」的消息傳遞,你可能想看看HTTP輪詢(又名長輪詢)。我不會像過去所看到的那樣,使用SQL進行臨時消息傳遞和短期狀態轉換。如果在單個Web服務器上運行,只需保持會話狀態或ASP.NET緩存中的狀態。如果在多個Web服務器上運行,請查看分佈式緩存,如memcached,Velocity(Win 2008)或NCache。然後將緩存的數據提供給正在等待的AJAX請求(由於長輪詢)。關鍵的設計問題是緩存鍵的設計(無雙關語意圖),這需要包含用戶的ID以用於用戶特定的事件數據。

P.S.有大規模,接近實時的消息分發框架,可以解決數百個客戶同時參與長輪詢時遇到的擴展問題。這些框架的廣泛名稱是「彗星」,當向許多客戶端廣播相同的消息時,它們是最有用的。

+0

好點。我已經刪除了我的答案(因爲你有一個參考)。 – 2010-09-16 04:38:51

+0

感謝這些指針...我會閱讀並嘗試這些並很快在此發佈我的結果。 – shashi 2010-09-16 07:36:09

+0

關於將狀態存儲在緩存中的問題。如果服務器開始耗盡內存,請問緩存不會銷燬對象以釋放內存,在這種情況下,另一個傳入請求可能會引發錯誤?這是一種可能性,在這種情況下我能做些什麼? – shashi 2010-09-16 08:01:27

相關問題