2009-09-12 46 views
0

我正在開發一個分佈式應用程序,其中每個分佈式站點將運行基於2層winform的客戶端 - 服務器應用程序(有沒有進入Web架構的具體原因)。本地應用程序服務器將負責與中央服務器通信,本地工作站將與本地服務器進行通信。使用C開發Windows服務的建議#

我即將開發一個或多個windows服務來實現以下目標。我認爲其中一些將在本地服務器上運行,而另一些則在本地工作站上運行。中央服務器僅僅是一個SQL Server數據庫,所以沒有爲此開發的服務,只有DML語句會從本地服務器觸發。

Windows服務目標

  1. 同步與基於時間表
  2. 採取基於時間表
  3. 自動下載從軟件更新自動備份數據庫從中央服務器(兩端SQL Server)的數據的本地數據基於日程安排的供應商站點
  4. 通過監視連接的工作站來強制執行軟件許可證管理
  5. 工作站之間的Intranet消息傳遞tions和/或本地服務器(就像一個小更豐富的NET SEND工具)
  6. 管理從本地服務器更新部署到工作站

雖然我有我的心事,我有點困惑在決定和我需要與像你這樣的專家交叉檢查我的想法。以下是我的查詢 -

  1. 應在本地服務器上運行多少服務? 請指定個人服務角色。

  2. 應該在工作站上運行多少個服務? 請指定個人服務角色。

  3. 由於某些服務需要查詢本地SQL數據庫,服務應該從哪裏讀取連接字符串?註冊表?配置文件?任何其他地點?

  4. 如果一個服務被分配來執行多個任務,例如,就像調度程序服務一樣,對於管理預定任務的性能而言,最佳/最佳方式應該是什麼 a。爲計劃任務構建.NET類庫程序集,並在單獨的線程上旋轉它們 b。建立計劃任務.NET可執行組件和消防可執行

雖然它可能似乎在一個崗位作爲太多問題,它們都是相關的。我稍後會與論壇分享我的觀點,因爲我不想以任何方式偏袒論壇的觀點/建議。

提前感謝大家。

+1

我肯定會長時間關注WCF(Windows Communication Foundation),而不是爲您的場景做傳統的Windows服務或Web服務。 – TrueWill

回答

2

應該在本地服務器上運行多少服務?

這取決於很多因素,但我通常會盡可能減少服務,因爲維護和監視一項服務對於管理員而言比對多項服務的工作要少。

工作站上應該運行多少服務?

我只用一個,因爲這會使它成爲單點故障。用戶會注意到工作站上的服務是否關閉。如果是這種情況,只需要啓動一項服務。

由於某些服務需要查詢本地SQL數據庫,應該從哪裏讀取連接字符串?註冊表?配置文件?任何其他地點?

我通常會把連接字符串放在app.config中。 .NET框架還提供了加密連接字符串的工具。

如果一個服務被分配以執行多個任務,例如,就像調度程序服務一樣,管理預定任務的性能方面應該是最佳/最佳方式。爲計劃任務構建.NET類庫程序集,並在不同的線程上旋轉它們b。爲計劃任務構建.NET可執行程序集並啓動可執行文件

b。更容易設計和實施。它使您可以使用Windows調度程序。在這種情況下,您需要考慮這個問題,當Windows調度程序啓動可執行文件時,以前的啓動尚未完成。這導致兩個過程,這可能會做同樣的事情。如果這不是問題,那麼留在那個設計上。如果這是一個問題,請考慮解決方案a。

對於解決方案a。看看Quartz.NET,它爲您提供了很多先進的調度功能。還考慮使用application domains而不是線程來使服務更健壯。

如果您沒有在本地服務器上獲得管理權限,請考慮在沒有服務控制管理器的情況下重新啓動服務的方式。給予一些特權用戶從客戶端機器重新初始化服務的可能性。

也想想如何重新啓動一個服務的一部分,如果一個服務正在做多個任務。例如,服務表現奇怪,因爲更新任務運行錯誤。如果您需要重新啓動整個服務來修復此問題,所有用戶可能會意識到這一點。提供一些手段來重新初始化更新任務。

最重要:如果您發現更簡單的方法來實現您的目標,請不要遵循我的任何建議。從一個簡單的設計開始。不要過度工程師!具有(多個)服務和調度的解決方案往往隨着每個附加功能的複雜性而爆炸。特別是當你需要讓這些服務彼此交談時。

+0

優秀的建議。 –

1

我不認爲有這樣的答案,有些人可能會使用一個服務和其他將模塊化每個域到一個服務和添加企業事務服務等等。問題是更多的SOA比C#一個,你可能會考慮閱讀一些SOA書籍以找到你的模式。

0

這並不是專門回答你的問題,但需要考慮的一件事是你可以在同一個進程中運行多個服務。 ServiceBase.Run方法接受一個ServerBase實例的數組來啓動。它們在技術上是不同的服務,並在服務控制管理器中出現,但它們在相同的過程中執行。再次,只是在更廣泛的問題背景下考慮的事情。