Как сохранить сетевой сокет в базе данных, чтобы приложение js оставалось без состояния? - PullRequest
0 голосов
/ 19 марта 2019

Мое приложение использует Net API (https://nodejs.org/api/net.html) сокетов и принимает подключения от клиентов, которые не могут использовать какой-либо другой способ связи, кроме необработанных TCP-сокетов.

Я пытаюсь использовать pm2 с моим приложением и кластеризовать его на всех моих процессорах. К сожалению, это не работает, так как один процесс не может использовать сохраненные в памяти сокеты из других процессов.

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

Кто-то еще задал почти такой же вопрос: ему сказали, что он должен просто использовать Redis для хранения сокетов. Но парень, который ответил, очевидно, не знал, как это сделать.

Вопрос был задан здесь: Будет ли PM2 работать с сетевым API Node.js?

Мой вопрос: как я могу это сделать?

На самом деле я думаю, что это просто невозможно. Что мне действительно нужно, так это способ «воссоздать» объект сокета по номеру дескриптора файла, который можно сохранить как целое число в базе данных, но, опять же, это становится действительно сложно. Я вроде застрял здесь. Документация ничего не говорит об этом.

Может быть, есть другой способ сохранить мое приложение без состояния?

Большое спасибо за чтение, я буду рад, если кто-то может помочь.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Нет способов сохранить специальный тип, являющийся ресурсом.

В базе данных вы можете сохранить способ ее воссоздания (повторного открытия).

Но я думаю, что в вашей ситуации лучшим решением будет добавить дополнительный слой, который обеспечит связь с дескриптором и всеми элементами кластера. В опции у вас есть: обмен событиями между узлами процесса или WebSockets .

0 голосов
/ 19 марта 2019

Что вы можете сделать, так это обмениваться дескрипторами файлов, передавая их между процессами сервера с помощью доменного сокета Unix.Посмотрите на пакет usocket , который реализует передачу файловых дескрипторов для Node.js.

...