2

我遇到了 Brian Ford 的这篇文章,其中谈到了限制 Socket.io 请求以帮助在大型应用程序中进行摘要 - http://briantford.com/blog/huuuuuge-angular-apps.html

我最近建立了一个工厂来支持 PUBNUB 的 JS API,并且在 JS 中实现限制以防止每次收到消息时都发生应用/摘要时遇到困难。这是工厂的工作 Plunkr - http://plnkr.co/edit/0w6dWQ4lcqTtdxbOa1EL?p=preview

我认为我遇到的主要问题是理解 Brian 的示例如何处理 Socket.io 的语法,以及如何将其应用于 PubNub 处理消息回调的方式。

谢谢!

4

1 回答 1

2

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);
    };
}
于 2013-08-22T02:20:38.130 回答