Nodejs Http 阻塞业务接口 压测 nodejs
const http = require('http');
// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {
// 设置响应头
res.writeHead(200, {'Content-Type': 'application/json'});
// 定义接口路径
if (req.url === '/index') {
// 模拟返回的数据
const data = {
message: 'Hello, this is the API response!'
};
var currentTime = new Date();
data.message=currentTime;
// 将数据转换为 JSON 格式并发送响应
res.end(JSON.stringify(data));
} else if (req.url === '/google') {
const options = {
hostname: 'cn.bing.com',
path:'/HPImageArchive.aspx?format=js&idx=0&n=1',
port: 80,
method: 'GET',
timeout:1000,
};
// 模拟返回的数据
fetchDataFromServer(options, (error, data) => {
if (error) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(error));
} else {
const googleData = {
message: data
};
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(googleData));
}
});
} else {
// 处理未知路径的请求
res.writeHead(200, {'Content-Type': 'application/json'});
res.end('Not Found');
}
});
function fetchDataFromServer(options, callback) {
const req = http.request(options, (res) => {
let data = '';
// 接收响应数据
res.on('data', (chunk) => {
data += chunk;
});
// 响应完成后处理数据
res.on('end', () => {
// 调用回调函数并传递获取的数据
callback(null, data);
});
});
// 处理请求错误
req.on('error', (e) => {
// 调用回调函数并传递错误信息
callback(e, null);
});
// 结束请求
req.end();
}
// 监听端口
const port = 3000;
server.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
阻塞接口压测
wrk -c 100 -t 10 -d 15s http://127.0.0.1:3000/google
QPS几十
同时压测普通接口
wrk -c 100 -t 10 -d 10s http://127.0.0.1:3000/index
QPS 3万左右,没有明显影响.
nodejs消费rabbitmq队列消息 nodejs
index.js
var amqp = require('amqplib/callback_api');
const MyConsume = require('./MyConsume');
amqp.connect('amqp://name:password!@localhost:5672/vhost', function (error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function (error1, channel) {
if (error1) {
throw error1;
}
var exchangeName = 'my_topic'; // 你的 exchange 名称
var exchangeType = 'topic'; // exchange 类型,可以是 direct、fanout、topic 等
var routingKey = 'my_routing_key'; // 你的 routing key
var queueName = 'my_queue'; // 你的队列名称
channel.assertExchange(exchangeName, exchangeType, { durable: true }, function(error2, ok) {
if (error2) {
throw error2;
}
console.log('Exchange ' + exchangeName + ' is ready');
// 声明一个队列
channel.assertQueue(queueName, { durable: true }, function(error3, q) {
if (error3) {
throw error3;
}
console.log('Queue ' +queueName + ' is created');
// 将队列绑定到 exchange,并指定 routing key
channel.bindQueue(queueName, exchangeName, routingKey);
console.log('Queue ' + queueName + ' is bound to Exchange ' + exchangeName + ' with routing key ' + routingKey);
// 在这里开始消费消息
channel.consume(queueName, function(msg) {
MyConsume.handleMessage(msg,channel);
}, {
noAck: false
});
});
});
});
});
MyConsume.js
const { UserModel } = require('./UserModel');
function handleMessage(msg,channel) {
UserModel.create({
user_name: 'Example Bookmark',
url: 'http://www.example.com',
type_id: 1,
order: 1,
is_recommend: true,
status: true
}).then(bookmark => {
console.log('New bookmark created:');
console.log(new Date());
}).catch(error => {
console.error('Error creating bookmark:', error);
});
// 在这里可以添加你的其他处理逻辑
channel.ack(msg)
}
module.exports = {
handleMessage: handleMessage
};
使用Mysql连接池,开10个mysql连接,消费3万rabbitmq消息,每条消息的逻辑是往mysql数据表写入一条数据,30秒写入完.
以上nodejs代码的写法我用php实现不到.哪怕是用swoole.如何用swoole来实现请高人指教.
标签: rabbitmq