Межпроцессная связь между node и C-приложением

97
12

У меня есть 2 компонента программного обеспечения, которые я хотел бы поговорить друг с другом,


    Веб-приложение node.js
    выделенный сервер, написанный на C (довольно простой фрагмент кода, который имеет дело с какой-то неясной библиотекой, которую я бы лучше не переносил на другие языки)

Связи, которые я хотел бы иметь, довольно просты,


    Node: указать идентификатор ресурса A
    C: Ок, здесь ref num

или


    Node: Снимите этот ref
    Приложение C: Конечно, приятель.

Есть ли безболезненный способ передать сообщения между 2?


Моя теоретическая идея в настоящее время есть что-то в этом роде:


    У вас есть 1 tcp/unix-сокет между 2-мя процессами, 1 сеанс, чтобы все время открывать и закрывать сессии (также боялись, что будет слишком много сразу).
    Каждый соответствующий запрос node и ответ приложения C имеют одинаковый идентификатор (сеансы tcp-esque по одному сеансу tcp)
    Каждый соответствующий запрос node генерирует сообщение в приложение C, имеет объекты ответа, хранящиеся в некоторых хэшах с идентификаторами сеанса как ключи.
    Имейте один поток node для сбора ответов на C-приложения, поиска объектов ответа по идентификатору сеанса и ответа на клиентский

Неужели это ужасно неэффективно?


Есть ли поддержка потоков в node? (короткий google не принес каких-либо конкретных результатов)

спросил(а) 2021-01-19T19:10:39+03:00 2 месяца, 3 недели назад
1
Решение
97

В основном вы находитесь в правильном направлении, вам нужно какое-то межпроцессное общение. Это действительно зависит от того, насколько сложна ваша IPC. Если речь идет только о некотором вызове методов и совместном использовании простых (т.е. Целочисленных, строковых) данных между методами, вы можете жить с unix-сокетами, которые довольно легко реализовать и поддерживаются nodejs изначально и довольно просты в использовании из C как (потому что нужные заголовки почти всегда доступны)


ZeroMQ предоставляет вам транспортную абстракцию (позволяющую IPC или настоящие сетевые транспорты) и множество привязок для даже неясных языков. Приведенные примеры для C и Node должны помочь вам в кратчайшие сроки. Однако вам нужны соответствующие заголовки и библиотеки; что, скорее всего, нужно будет создать в первую очередь.


Если данные, которые вы собираетесь обменивать между вашими программами, будут более сложными (читать структуры или массивы, вложенные объекты), тогда вам понадобится реальная реализация RPC. Там есть множество реализаций RPC; особенный Apache Thrift выглядел очень многообещающе для меня, хотя в конце концов я не мог заставить сборщик бережливости строить в разумные сроки.

Итак, в конце концов, для меня, имея довольно похожий вариант использования, я оказался в ZeroMQ для абстракции транспорта и, кроме того, используя JSON-RPC как механизм RPC. JSON-RPC довольно популярен для nodejs, а для C я использовал https://github.com/pijyoi/jsonrpc, который основывается на ZeroMQ и Jansson. Документация не существует, но если вы заходите так далеко, вы не должны бояться.


По производительности я не думаю, что это будет проблемой; ваш случай использования не звучит, как будто у вас много запросов за короткое время. Поскольку ZeroMQ также предлагает традиционный IPC в качестве транспорта, вы также можете использовать его для повышения производительности.

ответил(а) 2021-01-19T19:10:39+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема