AngularJS 中的 PubNub 速率限制与限制消息
在深入研究解决方案之前,我们想谈谈 和 的潜在理想特征或行为的rate limiting
变化throttling
。首先,您可能需要限制更新 UI 的频率或调用function()的频率。
如果你想跳到 plunker 源代码:http ://plnkr.co/edit/Kv698u?p=preview
的行为rate limiting
将展示最大每秒消息,每个事件之间的延迟由消息到达的速率触发。rate limit
您可以识别消息并将触发的事件平均分布在X 毫秒内,而不是通过消息到达管道的速率来触发所有事件。
然而,这种行为throttling
不同于rate limiting
仅使用接收到的最新消息而故意丢弃消息的行为。限制比速率限制方法更进一步,它完全排除了通过丢弃每条消息而识别的消息,只留下最近可用的消息以在设定的时间间隔进行处理。
还有一个概念,capping
即在一个时间跨度内,只允许 x 条消息到达,然后暂停事件直到时间跨度完成。 Capping
与速率限制或节流不同,其中消息接收的速率与处理它们的速率相同,而不是在一个时间间隔内均匀分布每个事件。所有消息都被识别(超过配额后丢弃是可选的)。
AngularJS 的 Plunker JavaScript 源代码编辑器
http://plnkr.co/edit/Kv698u?p=preview - 带有 AngularJS 绑定的代码视图。
使用 Plunker 预览一个工作示例!
AngularJS 中的 PubNub 速率限制
此过程需要一个队列来接收和存储所有消息,直到它们以缓慢稳定的方式处理。此方法不会丢弃任何消息,而是以设定的速率缓慢浏览每条消息,直到所有消息都被处理,而不管网络接收速率如何。
//
// Listen for messages and process all messages at steady rate limit.
//
pubnub.subscribe({
channel : "hello_world",
message : limit( function(message) {
// process your messages at set interval here.
}, 500 /* milliseconds */ )
});
//
// Rate Limit Function
//
function limit( fun, rate ) {
var queue = [];
setInterval( function() {
var msg = queue.shift();
msg && fun(msg);
}, rate );
return function(message) { queue.push(message) };
}
注意感兴趣的函数是limit()
以及它是如何在订阅调用的消息响应回调中使用的。
AngularJS 中的 PubNub 节流
这是一个只保留定期处理的最新消息的过程,同时有目的地丢弃在特定时间窗口内收到的所有旧消息。
//
// Listen for events and process last message each 500ms.
//
pubnub.subscribe({
channel : "hello_world",
message : throttle( function(message) {
// process your last message here each 500ms.
}, 500 /* milliseconds */ )
});
//
// Throttle Function
//
function throttle( fun, rate ) {
var last;
setInterval( function() {
last !== null && fun(last);
last = null;
}, rate );
return function(message) { last = message };
}
该throttle()
函数将丢弃在某个窗口中收到的消息,同时始终以设定的时间间隔处理最后收到的消息。
或者两者结合
//
// Listen for events and process last message each 500ms.
//
pubnub.subscribe({
channel : "hello_world",
message : thrimit( function( last_message, all_messages ) {
// process your last message here each 500ms.
}, 500 /* milliseconds */ )
});
//
// Throttle + Limit Function
//
function thrimit( fun, rate ) {
var last;
var queue = [];
setInterval( function() {
last !== null && fun( last, queue );
last = null;
queue = []
}, rate );
return function(message) {
last = message;
queue.push(message);
};
}