Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Межпроцессное взаимодействие, nodejs + nodejs, nodejs + qt и не только

#qt #nodejs #архитектура


Есть необходимость реализовать двухсторонний обмен данными между разными частями системы.
На данный момент в системе присутствуют:


модуль взаимодействия с внешними пользователями через rest api, реализован на nodejs;
модуль в котором реализована бизнес логика и взаимодействие с БД, реализован на qt;


Планируется:


веб морда для удобства взаимодействия с системой физических пользователей, будет
написана на reactjs.


Сейчас между nodejs и qt данные гоняют по веб сокетам. По ним же планируем обмен
данными и с веб мордой. Еще есть необходимость плагины из которых состоит qt модуль
разнести по разным процессам.

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


Ответы

Ответ 1



Есть масса методов взаимодействия между процессами. К примеру, его можно организовать с помощью простого TCP сокета. Для этого есть поддержка в node.js из коробоки. В Qt для этого используется QTcpSocket. Это самый простой вариант, потому что и там и там есть поддержка из коробки и на выходе мы имеем асинхронный IPC. Другим вариантом может быть использование разделяемой памяти. Судя по всему, есть горстка дополнений для node.js добавляющих поддержку оной. В Qt есть готовый класс QSharedMemory. Этот метод хуже, т.к. требует дополнительных плагинов и он синхронен(нужно «опрашивать» разделяемую память). Идём дальше: D-Bus. В node.js есть дополнение для этого, в Qt тоже есть: Qt D-Bus. Безусловно, можно ещё придумать способов. Что из вышеприведённых лучше? Я считаю, что самым простым и удобным будет использование обычного TCP сокета.

Ответ 2



Для организации взаимодействия типа запрос-ответ хорошо подходят пакетно-ориентрованные сокеты типа UDP. В отличие от поточно-ориентрованных, где данные записанные несколькими командами записи могут быть прочитаны за один раз и наоборот, для UDP одной команде записи соответствует одна команда чтения. Таким образом один запрос или ответ упаковываются в один пакет и принимаются одним вызовом read или recv, в Qt readDatagram, в node.js - в обработчике события 'message'. Так как обмен происходит внутри одной машины, за потерю пакетов можно не беспокоиться.

Комментариев нет:

Отправить комментарий