我正在尝试创建工具来模拟慢速Web服务器的场景。
创建mock server的动机
- 我们的前端应用程序通过同一个域与3个Web服务器-
X
Y
和Z
进行对话。example.com/api/X/
example.com/api/Y
等等。 - 我们看到我们的Web服务器
X
需要50秒来响应HTTP请求。 - 甚至建立WebSocket连接也需要1分钟。请注意,建立部分是延迟的-响应数据包中的延迟在我们的场景中是无关紧要的。
- 前端甚至无法连接到服务器
Y
和Z
,尽管Y
和Z
的服务器健康状况良好。
我们的预感是,由于HTTP 1.1的限制,对X
的5次调用(2次HTTP和3次WebSocket连接尝试)通过饥饿其他HTTP调用和WebSocket连接到其他后端服务器Y
和Z
的尝试来占用我们的前端应用程序。
问题陈述
为了测试同样的情况,我们想创建一个模拟服务器,它会延迟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');
});
1条答案
按热度按时间kq4fsx7k1#
我使用
server.on('upgrade', cb)
来设置延迟,然后调用wss.handleUpgrade
。通过这种方式,我成功地在WebSocket初始化部分创建了一个延迟。