2012-11-27 25 views
1

以下情景:我們已經有了一個數據庫表,其中存儲了用戶的新郵件。當用戶運行我們的客戶端應用程序時,應用程序需要顯示一個新圖標,當該用戶的條目插入到數據庫表中時,該圖標已經到達。如何爲大約100個客戶實現「新郵件圖標」?中央服務器輪詢或本地客戶端輪詢?

大約100個用戶將同時登錄。據我看到他們

兩個解決方案:

  1. 落實中央服務器上的服務。該服務器定期輪詢數據庫。此外,客戶端在啓動時需要向服務器註冊,以便在用戶的新消息到達時可以回撥它們。好:數據庫民意調查較少。不好:爲中心元素編碼更多。
  2. 每個客戶都自行輪詢數據庫。輪詢需要每分鐘發生一次,所以我有100個客戶每分鐘輪詢一次數據庫。餿主意?還是可以嗎?

所以,你會去哪個選項?

我們使用.NET 4.0作爲我們的客戶和MS SQL Server 2008作爲數據庫。

此外,如果你投的解決方案1:請問WCF服務是一個好主意?任何關於我的情況的鏈接或想法將不勝感激。

謝謝大家!

回答

1

進入選項1.更多代碼,但更具可擴展性。

0

我傾向於去與選項1.少客戶談話的數據庫是一件好事,如果你需要在以後更改數據庫或有添加一些其他的邏輯,會更容易。 WCF服務可能會正常工作。

+0

關於如何實現這樣的WCF服務的任何想法? – ManOnAMission

+0

是的。看看[this](http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28SYSTEM.SERVICEMODEL.SERVICECONTRACTATTRIBUTE.CALLBACKCONTRACT%29;k%28CALLBACKCONTRACT%29;k% 28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29; k%28DevLang-CSHARP%29&rd = true)以獲取關於如何實現雙工消息交換的一些指導。它應該允許服務器在客戶端建立連接之後觸發客戶端的回調。 –

1

我認爲WCF服務將是您的場景的理想選擇。 不要因WCF的複雜性而感到灰心。當你真正潛入它時,它會變得更容易。 這裏是一個簡單的教程,它可以幫助你開始:http://www.c-sharpcorner.com/UploadFile/mahakgupta/a-simple-example-of-wcf-service/

一旦你得到了一些工作 - 結帳http://www.packtpub.com/article/implementing-wcf-service-real-world爲更復雜的情況。當然,不要忘了MSDN :)。

我預見到你的應用程序的工作方式:

  1. Webservice的是在任何時候都在服務器上運行。
  2. 客戶端實例化與服務的連接(可能傳遞憑據)。
  3. GetNewMessages()被調用的方法會返回一組新的電子郵件(如果有的話)或者如果沒有新的消息,則返回Nothing。

沖洗,您認爲合適的重複上一個客戶端經常。

2

現在條條框框思考了一下,你可能會想探索(尤其是如果你已經有了一個Web服務器暴露內容的應用程序)的另一種選擇,是使用一個庫,將爲您提供長輪詢支持。例如,SignalR。這樣你就可以避免從客戶端進行輪詢,只是擔心收到通知。

Here's關於如何從控制檯應用程序以及標準的web/js實現中使用SignalR的教程。

現在,你有另一個問題是不斷輪詢數據庫的變化。您也可以通過使用ADO.net和SQL Server(服務代理和通知)中的SqlDependency功能來避免這種情況。

Here's一個示例聊天應用程序使用這種實時通知的方法。

根據併發客戶端的實際數量,您甚至可以直接從客戶端建立依賴關係(但建議使用而不是)。

所以,現在,結合這兩者,您可以讓您的服務器知道所有連接的客戶端,並且您可以使用SqlDependency僅在Messages表中的數據真正發生更改時觸發更新。 在這種情況下,您可能必須使用ConnectionManager獲取集線器,如bottom section of SignalR's wiki所示,標題爲「通過集線器外部的集線器進行廣播」

我相信這種方式比快速輪詢方式更好,並且會大大降低客戶端和服務器之間以及服務器和數據庫之間的總體流量。

但是,請注意,如果您要在網站中部署,您可能需要進一步研究SignalR目前對它的支持。