#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'. Так как обмен происходит внутри одной машины, за потерю пакетов можно не беспокоиться.
Комментариев нет:
Отправить комментарий