如何在nodejs中模拟一个滞后的web服务器?

1yjd4xko  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(118)

我正在尝试创建工具来模拟慢速Web服务器的场景。

创建mock server的动机

  • 我们的前端应用程序通过同一个域与3个Web服务器-XYZ进行对话。example.com/api/X/example.com/api/Y等等。
  • 我们看到我们的Web服务器X需要50秒来响应HTTP请求。
  • 甚至建立WebSocket连接也需要1分钟。请注意,建立部分是延迟的-响应数据包中的延迟在我们的场景中是无关紧要的。
  • 前端甚至无法连接到服务器YZ,尽管YZ的服务器健康状况良好。

我们的预感是,由于HTTP 1.1的限制,对X的5次调用(2次HTTP和3次WebSocket连接尝试)通过饥饿其他HTTP调用和WebSocket连接到其他后端服务器YZ的尝试来占用我们的前端应用程序。

问题陈述

为了测试同样的情况,我们想创建一个模拟服务器,它会延迟HTTP请求和WebSocket请求--特别是WebSocket连接部分应该被延迟以模拟这种情况。

我尝试了什么?

我尝试了以下方法,它在延迟HTTP调用方面效果很好,但是WebSocket连接立即连接,只是响应数据包延迟了,这不是我们想要的。
如何延迟WebSocket连接过程?

const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// HTTP route
app.get('/', (req, res) => {
  // Simulate a 50-second delay
  setTimeout(() => {
    res.send('HTTP Response: 200 OK');
  }, 5000);
});

// WebSocket route
wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    // Handle WebSocket messages
    console.log(`Received: ${message}`);
    setTimeout(() => {
      ws.send(`Received: ${message}`);
    }, 5000);
  });
});

// Start the combined server
server.listen(8080, () => {
  console.log('Combined HTTP and WebSocket server running on port 8080');
});
kq4fsx7k

kq4fsx7k1#

我使用server.on('upgrade', cb)来设置延迟,然后调用wss.handleUpgrade。通过这种方式,我成功地在WebSocket初始化部分创建了一个延迟。

const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ noServer: true });
const MOCK_DELAY_IN_MS = 50 * 1000;

// Middleware to introduce a 5-second delay for all HTTP GET requests
app.use((req, res, next) => {
  if (req.method === 'GET') {
    setTimeout(next, MOCK_DELAY_IN_MS);
  } else {
    next();
  }
});

// Route to handle all GET requests
app.get('*', (req, res) => {
  res.status(200).send('OK');
});

server.on('upgrade', (request, socket, head) => {
  // Delay WebSocket connection for 5 seconds
  setTimeout(() => {
    wss.handleUpgrade(request, socket, head, (ws) => {
      wss.emit('connection', ws, request);
    });
  }, MOCK_DELAY_IN_MS);
});

wss.on('connection', (ws) => {
  console.log('WebSocket connection established.');
  ws.on('message', (data) => {
    ws.send(`Received: ${data}`);
  });
  // Handle the WebSocket connection here
});

server.listen(8080, () => {
  console.log('Server is listening on port 8080');
});

相关问题