2010-08-16 66 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来更新数据库。您可以使用内部调度模块来定期更新数据库。