2010-08-16 114 views
0

我有一個關於從手機應用程序發送的用戶數據到服務器(Debian的5 LAMP)設計問題。我需要發送各種詳細信息,例如用戶名,出生日期,客戶訂單號。等等。這些將被傳遞到服務器上運行的C代碼應用程序(始終在進程中)。服務器IPC的設計問題

我目前使用命名管道IPC我的外置移動應用程序和C代碼服務器進程之間。我對這種溝通方式有一個權限問題,但不是試圖解決這個問題,而是想知道我是否有正確的方法!

首先,我從設計和安全的角度思考這是一種可接受的IPC方法,或者應該將數據寫入數據庫,然後運行一個cron作業,從數據庫中讀取新條目並然後將這些發送到服務器進程。

用我目前的方法,我擔心的是,如果有幾個用戶同時更新一些可能無法訪問管道,所以也許這些條目需要排隊,因此在這種情況下從數據庫中提取條目可能解決此問題。

我對這個數據庫解決方案的唯一擔憂是從移動設備和應用程序接收數據並將其傳遞開始,除非每10秒鐘執行一次cron作業,但是如果沒有時間,它可能會不必要地運行新條目。

沒有多少服務器端的經驗,我只是想知道是否有這個問題的任何標準溶液。

我目前使用下面的PHP代碼(Apache的調用)與服務器進程

$pipe="/tmp/pipe"; 
$mode=0600; 
if(file_exists($pipe)) 
{ 

    $f = fopen($pipe,"w"); 
    $result = fwrite($f,"some string"); 
    echo $result; 
} 

回答

0

我可能會建議你最好的選擇是使用共享數據存儲異步處理這些請求。

你不說,結果如何從過程到Web應用程序回來,但因爲它似乎是一個單方向的管道,也許沒有。

您上面提到的技術將不會是線程安全的/過程安全的,因爲競態條件會導致不同線程的輸出混合在一起,導致垃圾被接收。

我的建議是將文件寫入到一個「滑」目錄 - 但一定要他們寫在一個臨時名稱並在完成時將其重命名(更名爲原子,寫文件是不是)。

讓守護進程檢查此目錄中的文件(使用非臨時名稱)並以任何方式處理它們。可以通過類似的機制將結果寫入另一個目錄。

確保您的監控系統監控這些目錄中的文件數量以及最舊的文件的使用年限,以便收集故障。

+0

謝謝,是它唯一的單向數據爲此,我想用一個mysql數據庫作爲共享數據存儲與newentry標誌,然後守護進程可以處理這些並更新標誌,可能有成千上萬條目 我假設mysql可以處理來自web客戶端的多個同時訪問 – tech74 2010-08-16 11:51:16

0

我要說的是,你的做法是錯誤的首位通信。您正在嘗試使您的移動應用程序(它運行在移動設備上,不是嗎?)通過命名管道IPC與Debian服務器上的C-App進程進行通信,該IPC從不工作! IPC代表進程間通信,它是關於同一臺機器上的兩個進程之間的通信。命名管道是實現IPC的方式之一,因此只能在同一臺Linux機器上運行。

因此,請改用另一種方法。從我讀到的,你應該使用客戶機/服務器體系結構,其中您的服務器(C代碼應用程序)允許多個客戶端(移動應用程序)連接,同時發送數據&。服務器決定是否將傳入的數據刷新到數據庫或將數據緩存到內存中......這種通信方式不是被動的,因此您不必運行外部cronjob來更新數據庫。您可以使用內部調度模塊來定期更新數據庫。