我遇到了布莱恩·福特的这篇文章,其中谈到了限制Socket.io请求以帮助在大型应用程序中使用摘要 - http://briantford.com/blog/huuuuuge-angular-apps.html
我最近构建了一个工厂来支持PUBNUB的JS API,并且在JS中实现限制时遇到困难,以防止每次收到消息时应用/摘要都是hapenning。这是一个工作的Plunkr工作 - http://plnkr.co/edit/0w6dWQ4lcqTtdxbOa1EL?p=preview
我认为我遇到的主要问题是理解Brian的示例如何处理Socket.io的语法,以及它如何应用于PubNub处理消息回调的方式。
谢谢!
答案 0 :(得分:2)
在深入研究解决方案之前,我们想谈谈rate limiting
和throttling
的潜在理想特征或行为的变化。首先,您可能需要限制更新UI的频率,或者调用 function()时的速率。
如果您想跳到plunker源代码:http://plnkr.co/edit/Kv698u?p=preview
rate limiting
的行为将演示每秒最大消息数,并且在消息到达的速率触发的每个事件之间均匀分布延迟。您可以rate limit
识别消息并将事件均匀分布在 X毫秒上,而不是通过管道中的费率消息触发所有事件。
然而,throttling
的行为与rate limiting
的行为不同,capping
仅使用收到的最新消息而故意丢弃消息。节流是速率限制方法的又一步,并且完全排除了通过抛弃每条消息而识别的消息,并且只留下最近可用的消息以设定的间隔进行处理。
还有Capping
的概念,它在一段时间内只允许x消息到达,然后暂停事件直到完成时间。 //
// 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) };
}
与速率限制或限制不同,其中消息接收的速率与处理它们的速率相同,而不是在一个时间间隔内均匀分配每个事件。识别所有消息(超出配额后删除是可选的)。
http://plnkr.co/edit/Kv698u?p=preview - 使用AngularJS绑定的代码视图。
使用Plunker预览工作示例!
此过程需要一个队列来接收和存储所有消息,直到它们以缓慢稳定的方式处理。此方法不会丢弃任何消息,而是以设定的速率慢慢地咀嚼每条消息,直到所有消息都被处理,无论网络接收速率如何。
limit()
请注意,感兴趣的函数是//
// 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);
};
}
函数将丢弃在特定窗口中收到的消息,同时始终以设定的间隔处理最后收到的消息。
{{1}}