2010-09-28 76 views
3

我已經編寫了一個分層的Web應用程序,它由一個與Java服務交互的富Web客戶端(PHP)組成。 Web客戶端託管在apache服務器上,並且java服務在同一臺物理機器上運行(重申:整個應用程序,客戶端和服務在同一臺物理機器上運行)。作爲IPC反模式的數據庫

用戶請求 - > DB < - 輪詢 - > RequestHandler - > StoreResult在數據庫 - > Web客戶端更新頁面的結果(AJAX)。

客戶端和服務之間的通信使用關係數據庫來傳遞消息。 java服務具有單線程輪詢器,該輪詢器查找並處理來自客戶端的任何消息/請求。該系統的工作原理,但我對我的設計選擇沒有信心。

有沒有人對此策略有任何意見?我讀過使用數據庫作爲IPC反模式是不好的做法,或者至少是不適當的做法。但是,替代品 - XMLRPC(命名管道)似乎涉及其他依賴關係。

感謝您的期待。

+1

您正在使用數據庫作爲消息隊列。你應該研究的是:它是否構成一個好的消息隊列?如何可靠性(不要錯過任何情況下的單一信息)和吞吐量? – jrharshath 2010-09-28 18:45:06

+2

數據庫並非真正用於隊列/排隊。它們用於排隊軟件的持久性,如[ActiveMQ](http://activemq.apache.org/)。但有些數據庫提供[本機隊列支持(SQL Server)](http://www.developer.com/db/article.php/3640771/Getting-Started-with-SQL-Server-Service-Broker.htm).. 。 – 2010-09-28 18:47:23

+0

別的東西:你看過櫟屬嗎? – mario 2010-09-28 19:16:15

回答

4

如果是我,我需要PHP來抓取/使用來自java服務的數據,我會轉儲數據庫。

有127.0.0.1,端口5544(或一些隨機#)HTTP監聽java服務。讓servlet/jsp獲取RESTful請求,並吐出JSON結果。因此,如果它的搜索,網址將是:

h ttp://127.0.0。1:5544/search_zip_code/80203

和結果將是簡單的JSON:

{ 「城市」: 「丹佛」, 「狀態」: 「科羅拉多」}

,然後在PHP端做一個curl請求 - 使用用戶輸入的參數構建URL,執行curl請求,獲取數據並對其進行json_decode($ result_array = json_decode($ curl_result);)。

它會很簡單。這樣,您可以輕鬆地測試任一組件(從命令行執行curl/wget以測試java服務,或者檢查服務器端的access_log以查看搜索參數和來自客戶端的連接)。

對於PHP方面,使用curl_exec和json_decode(在PHP手冊中搜索這些函數)。

這是我發現的Java端隨機鏈接:

Parsing JSON data with java servlet struts

這樣將可擴展性(其易於分離的服務),模塊化(很容易測試任一部件),以及大量更快地將結果交付給客戶。

+0

我同意!我們最終做了一些非常相似的事情。謝謝,我對接受這個答案的延誤表示歉意。 – 2011-03-15 19:32:43

1

我看到DB以下參數作爲IPC:

1)您需要存儲你曾經收到的所有(或一段時間)的消息。

2)您需要高可靠性,不想丟失任何消息。

3)DB對面的性能是非常不同的。通過這種方式,客戶端可以生成大量的消息,右側的許多客戶端會處理它們。所以DB就像被動式負載均衡器一樣具有很高的可靠性。

您是否需要這些功能?我想不是。您不能將其用作負載平衡器,因爲所有進程都位於同一主機上。我認爲你不需要存儲所有的網絡請求。

在這種情況下,我會選擇簡單的套接字。

+0

有效的點數。因此,對於套接字客戶端需要打開一個套接字並將其消息發送給java服務。因此,我需要編寫代碼來管理服務器套接字。這有多高效?什麼樣的可靠性 - 服務器套接字崩潰等等。另外,爲每個用戶請求打開一個客戶端套接字是多麼昂貴?感謝您的建議。 – 2010-09-28 19:28:12

+0

你真的不需要失去一條消息嗎?對於網絡應用程序,通常不提供某些請求。用戶看到一個錯誤,並再次嘗試一次。所以一般來說,你不需要Web應用程序的高可靠性。 – Donz 2010-09-28 19:44:35

+0

你真的不需要失去一條消息嗎?對於網絡應用程序,通常不提供某些請求。用戶看到一個錯誤,並再次嘗試一次。所以一般來說,你不需要Web應用程序的高可靠性。連接到數據庫時,您也可以使用套接字,但使用更高級別的協議。所以你可以用原始插座達到更高的效率。如果你不想重新發明輪子,你可以使用從一個服務到另一個服務的HTTP請求。即使使用HTTP,您也會使用較少的CPU和使用數據庫的內存。要點 - 瞭解您真正需要的主要功能,並選擇適當的協議(或可能是DB) – Donz 2010-09-28 19:50:38

0

這是一個黑客,但它顯然適用於你。 Here is a web site關於如何在PHP中使用數據庫表實現消息隊列。

0

如果您只需要PHP的消息傳遞,那就使用ActiveMQ--就像UNIX IPC中的消息隊列一樣。 但是,數據庫可能與UNIX IPC中已知的共享內存和信號量相當。 因此,使用ActiveMQ和數據庫可以做到這一點,您可以使用UNIX IPC,但是如果一臺服務器對您來說太小,它可以進行羣集。