обмениваться запросами между серверами с помощью nodejs socket io express react client

#node.js #socket.io

#node.js #socket.io

Вопрос:

Я пытаюсь написать следующее приложение: у меня есть 2 сервера на 2 разных машинах. Клиент может подключиться к серверу A, отправить какое-либо сообщение, затем подключиться также к серверу B, снова отправить сообщения, и он будет видеть сообщения, полученные на обоих серверах в каждом клиентском окне. Это означает, что когда сервер A или B получает сообщения, они должны отправлять их на второй сервер, а второй сервер должен отправлять это сообщение клиенту. Я попробовал следующий код, на разных портах localhost, один и тот же код на обоих серверах, но, похоже, что «socket_other_server.on (serv_message)» так и не произошло. Пожалуйста, какие-либо предложения?

 const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)

var client = require('socket.io-client');
var socket_other_server = client.connect('http://localhost:4002', { reconnect: true });


io.on('connection', socket => {
  socket.on('message', ({ name, message }) => {
    io.emit('message', { name, message })
    console.log("Message from client broadcasted: "   message);
    console.log("Sending message to 8002 server: "   message);
    socket_other_server.emit('serv_message', { name, message });
});

  })

  socket_other_server.on('connect', function () {
    console.log("CONNECTED")
    socket_other_server.on('serv_message',  ({ name, message }) =>{
      console.log('RECEIVED MESSAGE FROM SERVER 8002 '  message);
      io.emit('message', { name, message });

  });
  console.log('Connected to server 4002!');
});

http.listen(4003, function() {
  console.log('listening on port 4003')
})
 

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

1. если это было неясно, то: console.log(‘ПОЛУЧЕНО СООБЩЕНИЕ ОТ СЕРВЕРА 8002’ сообщение); строка никогда не печаталась

Ответ №1:

Поскольку это 2 приложения, запущенные на разных машинах (в вашем случае имитируется использование разных портов), сервер A не будет знать, что происходит на сервере B, и наоборот. Вы должны использовать какую-то базу данных, к которой имеют доступ оба сервера. Он служит своего рода мостом между ними.

Концепция аналогична хранилищу сеансов. Если вы используете балансировщики нагрузки для своего приложения, как один сервер узнает, вошел ли клиент в систему, если запрос на вход сделан на другом сервере в вашем пуле серверов?

Сервер может проверять хранилище сеансов, общее для всех из них, поэтому он может знать, что пользователь уже вошел в систему.