2010-08-24 67 views
0

我們目前有一個WCF服務,它開始達到它的極限性能明智。WCF服務設計

我們決定添加另一臺服務器,它將託管WCF服務的另一個實例。我們有網絡應用程序,它們必須根據上下文...與特定的服務器進行通信。如果Web應用程序正在處理來自ServiceInstance1的對象,則請求必須定向到ServiceInstance1的EndPoint。如果Web應用程序正在處理ServiceInstance2中的對象,則請求必須定向到ServiceInstance2的EndPoint。

我最初認爲可以創建「中間服務」或「服務管理器」,Web應用程序的服務參考將從單個服務實例更新到「中間服務」或「服務管理器」,並且所述服務將會充當各種服務實例的「經紀人」。

這是如何完成的?

我目前在Manager中添加了一個ServiceReference給每個服務,但是看起來一旦服務被「引用」,它的類型就變得特定於ServiceReference的類型,例如

ServiceInstance1的類型都是{ServiceInstance1}。 ServiceInstance2的類型都是{ServiceInstance2}。

我需要類型在Web應用程序端是相同的,所以這顯然是錯誤的方式來做到這一點。

我也希望在引用「中間服務」或「服務管理器」生成的客戶端上調用正確的服務實例時調用方法,例如,

IServiceManager.GetProjectById({GUID}) -> 

回來的ServiceManager - > 決定哪臺主機有該項目,並從正確的服務實例返回ProjectObject。

其中ProjectObject是一個類型定義在ServiceInstance1和ServiceInstance2中。

我認爲原始服務需要將一些DLL拉出來,以便它們可以從Web應用程序端和ServiceManager中引用,並且可以創建GenericWCF客戶端。

如果我是對的hooray對我如果有人能指出我在正確的方向,我將不勝感激。如果我錯了,有人可以責罵我,告訴我這是如何正確完成的!

+1

使用路由策略,你只會將你的擴展限制從後端服務器轉移到路由服務器。它還增加了一個你必須購買,維護,安全的服務器。一個穩定的負載平衡策略會讓你更快,更快。 – Mark 2010-08-27 16:24:34

回答

1

只是爲了回答這個問題並關閉它,我利用.Net 4.0中的路由策略和自定義的客戶端類,我在代理生成的類之後建模。

在我準備好自定義客戶端之前,我使用了自動生成的客戶端代碼,並從中派生出了一個類,它允許我更改它連接的服務。我通過在序列化的所有服務對象上提供的屬性確定了哪個服務。

長話短說這是100%的預期,包括ServiceManager甚至可以繞過我們允許的某些電話。

我們甚至有能力在運行時將項目從服務器移動到服務器!

感謝大家幫助! (特別是我自己實際上做的工作,而不是勺子喂)

0

完成您要做的事情的最簡單方法是停止使用服務器託管的服務URL來生成代理。相反,請從本地* .xsd和* .wsdl生成代理,並僅更改端點的URL。或者,您可以使用ChannelFactory<T>來即時生成代理,並在客戶端引用您的接口.dll。

一旦你這樣做了,你可以使用任何常見的網絡服務器負載平衡技術來平衡服務器之間的負載。

不要把它放得太細,但Visual Studio的「服務引用」對您開發的服務沒有用處,也不應該使用。它僅適用於外部開發的服務,其URL和合約很可能會從更改爲。我個人從未有機會使用它。對於您自己的服務,您應該使用ChannelFactory<T>或基於ClientBase<T>的類來計算代理。

+0

如果需要,使用「添加服務引用」但在運行時更改URL會出現什麼問題。 – 2010-08-24 22:38:49

+0

因爲我們希望多個後端服務器對使用這些服務的Web應用程序是透明的。通過這種方式,所有Web應用程序都具有相同的代碼庫,無論其實際與哪個服務器進行通信。 – Jay 2010-08-25 12:41:40

1

解決您的問題的方法是創建共享程序集與兩個服務使用的類型。在使用您的服務的客戶端(管理器)上引用此程序集,並通過添加服務引用標記來創建代理時引用程序集中的重用類型。

你正在構建的是非常簡單的消息路由器。在WCF 4.0中,還有對routing services的額外支持,因此您應該在開發自己的功能之前檢查這些功能。對於WCF 3.5 MSDN雜誌包含有關構建消息路由器的文章 - part 1part 2

+0

謝謝你的輸入......我想這將是這樣的事情。 我會審查郵件路由的東西,並選擇我的poision。 再次感謝您的意見。 – Jay 2010-08-25 12:51:50