Какие эффективные способы передачи данных (2 МБайта) от одного приложения к другому есть в linux?
Есть web-app, который в Post запросе принимает файл от пользователя:
1. Сохраняет файл (1 МБайт) в fs по уникальному пути: uniquePath := userID + time
2. Передает путь к файлу программе z-app: exec.Command(Z, uniquePath).Stdout = &stdout
3. Ждет завершения работы программы z-app (около 5-10 сек, web-api запросы)
4. Передает результат (2 MБайта) в Post: w.Write(stdout.Bytes())
Программа z-app:
1. Будет часто обновляться, без потерь для ожидающих завершения работы пользователей.
Как эффективнее реорганизовать взаимодействие web-app с z-app? Pipe, FIFO, что-то другое? web-app и z-app написаны на Golang
Если ваша z-app по сути является бэкендом для web-app, не вижу проблемы запускать z-app как субпроцесс, скармливая ей данные через stdin и забирая результат из её stdout, Поскольку z-app всё равно работает долго, накладные расходы на запуск дочернего процесса проблемой не будут. Python это делает своим модулем subprocess, как это делает golang - не знаю.
В любом случае вы уткнётесь в передачу данных или напрямую через поток, или сохранением потока на диск в файл и передачей имени файла. Если же у вас z-app часто обновляется, решение с субпроцессами даст ещё и отсутствие проблем с апдейтами - новый инстанс просто запустится из нового файла
В чем проблема выведения ошибки в консоль? Если ошибки выводить в STDERR, а обмен данными производить через STDOUT, никаких проблем не будет.
Общение удобнее организовать через юникс-сокеты или через tcp на localhost. Пускай z-app висит демоном и принимает задачи на обработку.
x32net: select используется когда надо ждать данные из нескольких каналов или надо сделать что-то в случае если данных сейчас в канале нет.
Чтобы просто подождать ответ из канала можно оставить только конструкцию msg := <-jr
Александр Павлюк: тут было предположение: пользователей одновременно отпавивших post больше одного, чей первый обработается неивестно. А так же есть канал откуда поступают данные и их надо распределять по пользователям.
x32net: у вас изначально неверный подход, postHandler читает из канала значение и если оно не совпадает с его номером, то просто его выкидывает. Поэтому у вас и теряются сообщения.
Если латентность 5-10сек вас устраивает можно обойтись fsnotify(например https://fsnotify.org/). web-app плодит файлы по уникальному пути. z-app отслеживает изменения в файловой системе и обрабатывает новые. Результат работы z-app заливает в тот же или новый файл по уникальному пути. web-app в свою очередь мониторит файловую систему и забирает новые результаты. Все асинхронно, прямой связи вообще нет. z-app может работать в несколько потоков.