2010-07-21 43 views
5

我正在研究按組織分解用戶的系統。每個用戶都屬於一個組織。每個組織都將其數據存儲在駐留在數據庫服務器計算機上的自己的數據庫中。數據庫服務器可以管理一個或多個組織的數據庫。如何'網絡啓用'傳統的C++應用程序

現有(傳統)系統假定只有一個組織,但是我想通過運行它的「實例」(綁定到一個組織)來「擴展」應用程序,並在服務器計算機上運行多個實例即運行「單一組織」應用程序的多個實例 - 每個組織有一個實例)。

我將爲服務器上運行的每個實例提供一個RESTful API,以便可以使用瘦客戶機訪問運行在服務器計算機上的實例提供的服務。

下面是一個簡單的示意圖,演示的關係:

服務器1 - >Ñ數據庫(每個 組織具有一個數據庫)

組織1 - > N個用戶

我的問題涉及如何將來自客戶端的RESTful請求「引導」到正在處理來自該組織用戶請求的適當實例。

更具體地說,當我收到一個RESTful請求時,它將來自一個用戶(屬於某個組織),將請求「路由」到適當的應用程序實例的方式(或實際上最好的方式是什麼)在服務器上運行?

回答

1

從我可以收集,這本質上是一個分片問題。無論您如何在硬件級別分割實例(使用虛擬機,多臺服務器,全部位於一臺強大的服務器等),您需要在整個體系結構中設置一箇中央註冊表和代理層,以根據請求將給定用戶映射到正確的目標實例。

當然有很多方法可以實現這一點,所以只需選擇一個你知道並且速度很快的方法,並且可以擴展,因爲所有的請求都會通過它來完成。我會建議一個輕量級無狀態Web應用程序,它由一個簡單的只讀數據庫支持,它執行適當的客戶端標識符 - >實例映射,您將加載到內存/緩存中。爲了增加硬件和實例位置的靈活性,使用(假設Java)JNDI來存儲每個實例的硬件/端口/ etc信息,並在標識符映射中將客戶端標識符映射到適當的JNDI查找鍵。

+0

最實用的答案,我想是:) – morpheous 2010-07-23 11:10:58

0

這確實是一個非常棘手的問題;只是因爲有很多可能的答案,哪一個最好只能由你和你的環境決定。

我會在C++中編寫一個apache模塊來做到這一點。使用this book,我設法開始編寫非常高效的模塊。

爲了能夠給你更多的解決方案(可能只是設置一個Squid代理?),你需要指定你將如何確定你需要重定向客戶端的服務器。如果你可以通過IP來完成,雖然是一個GET參數,儘管是一個POST XML參數(如SOAP)。等

+0

我必須承認,我被編寫apache模塊的想法引誘 - 但艾哈邁德讓我回到了現實:) – morpheous 2010-07-23 11:08:35

+0

@控制我已經做了,並沒有那麼糟糕。使用教程作爲我的應用程序的基礎,我以半天的時間運行。從那時起,我從來沒有真正回過頭去觸及任何Apache特定的東西。 – Gianni 2010-07-23 13:39:02

0

作爲其他答案說有很多方法來解決這個問題。假設您無法訪問舊版軟件源代碼,這意味着您無法修改它以偵聽不同實例的不同端口。

編寫Apache模塊似乎極端極端來解決這個問題(並且作爲實際上剛剛完成編寫生產apache模塊的人,我建議您避免使用它,除非您正在賺大錢)。

該方法可以像您一樣深奧。例如,如果您的傳統軟件運行在正常的英特爾架構上,並且您擁有硬件容量,那麼就有虛擬機解決方案,您應該能夠創建一個精簡虛擬機,運行單個軟件實例和多路複用器以將所有虛擬機捆綁在一起。

如果另一方面你正在運行類似HPUX的東西:-)還有其他方法。你如何提供更多細節?

艾哈邁德。

1

讓公共API只指定用戶聽起來有點脆弱。我會更改公共API,以便請求指定組織和用戶,然後讓一些簡單的服務器端將組織映射到實例(例如,組織foo - >實例在端口7331上偵聽)。

+0

沒錯,但是改變API是一個簡單的問題,但要解決。 – morpheous 2010-07-23 11:10:18