我目前正在运行服务器。我编写的机器人目前为主持人提供管理工具,但我希望机器人内置一些自动防洪系统。
因此,我可以访问用户发送的每条消息,发送消息的用户的名称以及时间他们发了短信。我不确定如何制作系统,是否有人有任何想法?我希望能够为服务器中的每个用户调节防洪保护。
答案 0 :(得分:1)
创建一个以用户名为主的地图。每个用户的值应该是长度为n
的圆形数组(例如十个)。每个循环数组的内容应该是请求的时间戳。
在每个入站请求中,从该数组中获取该用户名的n
项。从performance.now()
中减去它,然后进行数学运算以查看该速率是否可接受。如果没有,请执行no-op,或返回HTPP错误代码。
以下代码仅供参考,并不具备实用性。
var Q_LENGTH = 10;
var MAX_REQUEST_RATE = 1; // per second
var requestTimeMap = {};
function onRequest(username, timestamp) {
recordReq(username);
if(tooFast(username)) {
// return HTTP 40x
}
// service the request
}
function recordReq(username) {
requestTimeMap[username] = requestTimeMap.username || createCircularQ(Q_LENGTH);
requestTimeMap[username].unshift(performance.now())
}
function tooFast(username) {
return ((performance.now() - (requestTimeMap[username][Q_LENGTH] || 0)) / Q_LENGTH) > (1000 / MAX_REQUEST_RATE);
}
function createCircularQ(length) {
var circularQueue = [];
circularQueue.unshift = function(element) {
if (this.length === length) {
this.pop();
}
return Array.prototype.unshift.call(this, element);
}
return circularQueue;
}