2010-08-16 4 views
0

휴대 전화 앱에서 서버로 사용자 데이터를 보내는 것과 관련하여 디자인 문제가 있습니다 (데비안 5 램프). 사용자 이름, 생년월일, 고객 주문 번호 등 다양한 세부 정보를 보내야합니다. 이것들은 서버에서 실행되는 C 코드 앱 (항상 프로세스 중)으로 전달됩니다.서버 IPC 디자인 문제

현재 외부 모바일 응용 프로그램과 C 코드 서버 프로세스간에 IPC 용으로 명명 된 파이프를 사용하고 있습니다. 이 통신 방법에 대한 사용 권한 문제가 있지만 대신이 문제를 해결하기 위해 노력하는 대신 처음부터 올바른 방법이 있는지 궁금합니다.

우선 디자인과 보안 관점에서이 경우 IPC의 허용 가능한 방법인지 궁금 해서요. 또는 데이터베이스에 데이터를 쓰고 데이터베이스에서 새 항목을 읽는 cron 작업을 실행해야합니다. 이것들을 서버 프로세스에 보낸다.

내 현재의 방법으로 나는 약간의 사용자가 동시에 파이프에 접근하지 못할 수도 있으므로, 엔트리가 대기열에 있어야하므로 데이터베이스에서 항목을 가져올 수 있습니다. 이것을 해결하십시오.

이 데이터베이스 솔루션에 대한 유일한 관심은 cron 작업이 매 10 초마다 실행되지 않는 한 모바일 및 응용 프로그램의 데이터를 수신하는 사이에 지연이 발생했지만 아무런 응답이 없으면 불필요하게 실행될 수 있다는 것입니다. 새로운 항목.

이 문제에 대한 표준 솔루션이 있는지 궁금한 점이 많습니다.

나는 현재 서버 프로세스

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

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

답변

0

공유 데이터 저장소를 사용하여 이러한 요청을 비동기 적으로 처리하는 것이 가장 좋습니다.

결과가 프로세스에서 웹 응용 프로그램으로 어떻게 돌아 왔는지는 말하지 않았지만 단일 방향 파이프 인 것처럼 보이지는 않을 것입니다.

경주 조건으로 인해 서로 다른 스레드의 출력이 혼합되어 가비지가 수신되므로 위에 언급 한 기술은 스레드 안전/프로세스 안전이 아닙니다.

내 의견은 "스풀"디렉토리에 파일을 쓰는 것이지만 임시 이름으로 쓰고 이름을 바꿀 때마다 이름을 바꾸어야합니다 (파일 이름 바꾸기는 원자 적이며 파일 쓰기가 아닙니다).

데몬이이 디렉토리의 파일 (비 임시 이름 포함)을 검사하도록하고 어떤 방식 으로든 처리하도록하십시오. 선택적으로 비슷한 메커니즘을 사용하여 결과를 다른 디렉토리에 씁니다.

모니터링 시스템에서 이러한 디렉토리의 파일 수와 가장 오래된 것의 수명을 모니터링하여 오류가 발생하지 않도록하십시오.

+0

고마워, 네, 이것에 대한 유일한 단방향 데이터, 나는 newentry 플래그와 공유 데이터 저장소로 MySQL 데이터베이스를 사용하려고 생각하고 다음 데몬이 다음을 처리하고 플래그를 업데이 트 수천 수 있습니다 entries mysql이 웹 클라이언트에서 여러 개의 동시 액세스를 처리 할 수 ​​있다고 가정합니다. – tech74

0

나는 당신의 접근 방식은 처음부터 잘못이라고 말할 것와 통신 할 (아파치에서 호출) 다음과 같은 PHP 코드를 사용합니다. 절대로 작동하지 않는 named pipe IPC를 통해 데비안 서버의 C-App 프로세스와 통신하는 모바일 응용 프로그램 (모바일 장치에서 실행되는 것입니까?)을 만들려고합니다! IPC는 프로세스 간 통신 (Inter Process Communication)의 약자로, 동일한 시스템의 두 프로세스 간 통신에 관한 것입니다. 명명 된 파이프는 IPC를 구현하는 방법 중 하나이므로 동일한 Linux 시스템에서만 작동합니다.

그래서 다른 방법을 사용하십시오. 내가 읽은 바에 따르면 서버 (C 코드 앱)가 여러 클라이언트 (모바일 앱)가 & 데이터를 동시에 전송할 수있게하는 클라이언트/서버 아키텍처를 사용해야한다. 서버는 들어오는 데이터를 데이터베이스로 플러시할지 또는 메모리에 데이터를 캐시할지 결정합니다.이 통신 방법은 수동이 아니므로 외부 cronjob을 실행하여 데이터베이스를 업데이트 할 필요가 없습니다. 내부 스케줄링 모듈을 사용하여 정기적으로 데이터베이스를 손상시킬 수 있습니다.