异地服务器之间,Nodejs服务端,用什么方式通信比较稳定靠谱?

异地服务器之间,Nodejs服务端,用什么方式通信比较稳定靠谱?

如题,几台服务器之间,各自距离都很远(数千米),服务端都是node写的,他们之间需要实时消息通信,这个用什么方法实现比较好?json rpc?

每秒消息量大约在几百条左右,每条消息内容类似:{“uid”:123123,“eventType”:1,“content”:“hasNew”}

要求:

1、网络条件不稳定的时候,需要及时重试重连,期间消息允许一定程度的丢失;

2、使用的端口尽量的少;

3、各个服务器之间的ping值一般在100ms以下,但是带宽有限,所以需要流量小,实时性高。

请各位大牛帮忙推荐一个方案,谢谢!


3 回复

在异地服务器之间进行Node.js服务端通信时,选择一种稳定且可靠的通信协议是非常重要的。考虑到你的需求,包括实时消息通信、网络条件不稳定时的重试机制、低带宽环境下的高效传输等,WebSocket 是一个非常合适的选择。WebSocket 提供了全双工的通信通道,并且能够在网络条件不佳的情况下自动重连,非常适合你的应用场景。

推荐方案:使用 WebSocket

优点:

  1. 双向通信:客户端和服务端可以随时发送数据。
  2. 低延迟:适合实时应用。
  3. 自动重连:在网络条件不稳定时可以自动重连。
  4. 流量小:只需要一个端口(默认为80/443)。

示例代码

服务端代码 (使用 ws 库)

首先,你需要安装 ws 库:

npm install ws

然后,创建一个简单的 WebSocket 服务端:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
    console.log("A client connected");

    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        // 可以在这里处理接收到的消息
    });

    ws.on('close', function() {
        console.log("Client disconnected");
    });
});

console.log("WebSocket server is running on ws://localhost:8080");
客户端代码 (使用 ws 库)

同样,安装 ws 库:

npm install ws

然后,创建一个简单的 WebSocket 客户端:

const WebSocket = require('ws');

const ws = new WebSocket('ws://your-server-address:8080');

ws.on('open', function open() {
    console.log("Connected to server");
    ws.send(JSON.stringify({"uid":123123,"eventType":1,"content":"hasNew"}));
});

ws.on('message', function incoming(message) {
    console.log('received: %s', message);
    // 处理接收到的消息
});

ws.on('close', function close() {
    console.log("Disconnected from server");
    // 可以在这里重新连接
});

解释

  • 服务端 创建了一个 WebSocket 服务器,并监听连接和消息事件。当有新连接时,会打印一条消息,并处理接收到的消息。
  • 客户端 连接到服务端,并在连接成功后发送一条消息。它还会监听消息和断开连接事件,以便在断开连接后尝试重新连接。

通过这种方式,你可以在异地服务器之间建立一个稳定且高效的通信通道,同时满足实时性和低带宽的要求。


websocket +json消息,其实你这种就几百每秒的并发可以直接用http就可以了

针对您的需求,可以使用 WebSocket 或者 MQTT 来实现跨服务器的实时消息通信。这两种协议都支持实时通信,并且在网络条件不稳定时能够自动重连和重试。

方案一:WebSocket

WebSocket 提供全双工通信通道,可以在单个 TCP 连接上进行实时双向通信。这对于消息实时性要求较高的场景非常合适。

示例代码

服务端(Node.js)

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send(JSON.stringify({"uid": 123123, "eventType": 1, "content": "hasNew"}));
});

客户端(Node.js)

const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');

ws.on('open', function open() {
  console.log('Connected');
});

ws.on('message', function incoming(data) {
  console.log('received: %s', data);
});

// 模拟发送消息
setTimeout(() => {
  ws.send(JSON.stringify({"uid": 456456, "eventType": 2, "content": "test"}));
}, 2000);

方案二:MQTT

MQTT 是一种轻量级的消息传输协议,非常适合在物联网环境中使用,因为它具有低带宽、低功耗的特点。它采用发布/订阅模型,使得消息能够在多个客户端间高效传递。

示例代码

服务端(Mosquitto Broker)

您需要安装一个 MQTT Broker,例如 Mosquitto。

sudo apt-get install mosquitto

客户端(Node.js)

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');

client.on('connect', () => {
  console.log('Connected to MQTT broker');
  client.subscribe('test/topic');
});

client.on('message', (topic, message) => {
  console.log(`Received message on topic ${topic}: ${message.toString()}`);
});

client.publish('test/topic', JSON.stringify({"uid": 123123, "eventType": 1, "content": "hasNew"}));

总结

根据您的需求,WebSocket 和 MQTT 都能满足您的需求。如果希望简化通信逻辑,建议使用 WebSocket;如果需要在复杂的分布式系统中使用,建议使用 MQTT。两者都可以满足您对实时性和网络稳定性方面的要求。

回到顶部