Проблема разработки IPC сервера

0

У меня проблема с дизайном в отношении отправки пользовательских данных из приложения мобильного телефона на сервер (Debian 5 LAMP). Мне нужно отправить различные данные, такие как имя пользователя, дату рождения, номер заказа клиента. и т.д. Они будут переданы на приложение кода C (всегда в процессе), запущенном на сервере.

В настоящее время я использую именованные каналы для IPC между моим внешним мобильным приложением и процессом C-сервера. У меня есть проблема с этим методом связи, но вместо того, чтобы просто пытаться разрешить это, мне было интересно, есть ли у меня правильный подход в первую очередь!

Во-первых, мне было интересно, с точки зрения дизайна и безопасности это приемлемый метод IPC в этом случае или СЛЕДУЕТ ли я записывать данные в базу данных, а затем запускать задание cron, которое считывает новые записи из базы данных, а затем отправляет их серверному процессу.

В моем текущем методе я обеспокоен тем, что, если есть несколько обновлений пользователей, в то же время некоторые могут не получить доступ к каналу, поэтому, возможно, записи должны быть поставлены в очередь, поэтому в этом случае сбор записей из базы данных может решить это.

Единственная проблема, с которой я столкнулся с этим решением для баз данных, заключалась в задержке между получением данных с мобильного устройства и приложением и передачей его, если задание cron не запускалось каждые 10 секунд, но затем оно могло бы работать без необходимости, когда нет новых записей.

Не имея большого опыта на стороне сервера, я просто задавался вопросом, существуют ли какие-либо стандартные решения этой проблемы.

В настоящее время я использую следующий php-код (вызываемый из apache) для связи с серверным процессом

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

   $f = fopen($pipe,"w");
   $result = fwrite($f,"some string");
   echo $result;  
}
Теги:

2 ответа

0
Лучший ответ

Я бы предположил, что лучше всего использовать общий хранилище данных для обработки этих запросов асинхронно.

Вы не сказали, как результаты возвращаются из процесса в веб-приложение, но, как кажется, это однонаправленный канал, возможно, его нет.

Техника, о которой вы указали выше, не будет безопасной для потоков/процессов, поскольку условия гонки вызовут смешение выхода из разных потоков, что приведет к принятию мусора.

Мое предложение состояло в том, чтобы записывать файлы в каталог "spool", но не забудьте записать их под временным именем и переименовать их по завершении (переименовать атомарно, писать файлы нет).

Попросите демона проверить файлы в этом каталоге (с невременным именем) и обрабатывать их любым способом. Необязательно записать результаты в другой каталог с помощью аналогичного механизма.

Убедитесь, что ваши системы мониторинга контролируют количество файлов в этих каталогах и возраст самого старого, чтобы получить ошибку.

  • 0
    спасибо, да это единственные данные о направлении для этого, я думаю об использовании mysql db в качестве общего хранилища данных с флагом newentry, затем демон может затем обработать их и обновить флаг, могут быть тысячи записей, которые я предполагаю mysql может обрабатывать несколько одновременных доступов из веб-клиентов
0

Я бы сказал, что ваш подход был неправильным в первую очередь. Вы пытаетесь сделать свое мобильное приложение (оно работает на мобильном устройстве, не так ли?), Взаимодействуя с процессом C-App на вашем сервере Debian через named pipe IPC, который никогда не работает! IPC означает Inter Process Communication, и речь идет о связи между двумя процессами на одной машине. Именованный канал является одним из способов реализации IPC и, таким образом, работает только на одной машине Linux.

Итак, используйте другой подход. Из того, что я прочитал, вы должны использовать архитектуру клиент/сервер, в которой ваш сервер (приложение с кодом C) позволяет нескольким клиентам (мобильному приложению) одновременно подключать и отправлять данные. Сервер решает, удаляет ли он входящие данные в базу данных или кэширует эти данные в памяти... Этот способ связи не является пассивным, поэтому вам не нужно запускать внешний cronjob для обновления базы данных. Вы можете использовать внутренний модуль планирования для регулярного udpate базы данных, хотя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню