【问题标题】:Throttling PubNub requests in AngluarJS在 AngularJS 中限制 PubNub 请求
【发布时间】:2013-08-21 18:21:15
【问题描述】:

我看到了 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 处理消息回调的方式。

谢谢!

【问题讨论】:

  • 正在撰写包含详细信息的回复,并将包括摘要以及解决方案的解释作为答案。

标签: angularjs pubnub


【解决方案1】:

AngularJS 中的 PubNub 速率限制与限制消息

在深入研究解决方案之前,我们想谈谈rate limitingthrottling 的潜在理想特征或行为的变化。首先,您可能需要限制更新 UI 或调用 function() 的频率。

如果你想跳到plunker源码:http://plnkr.co/edit/Kv698u?p=preview

rate limiting 的行为将展示 最大每秒消息数,每个事件之间的延迟均由消息到达的速率触发。您可以rate limit您对消息的识别并在 X 毫秒内平均分布事件触发,而不是通过消息到达管道的速率来触发所有事件。

但是throttling 的行为与rate limiting 的行为不同,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);
    };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2021-03-05
    • 2012-03-08
    • 2015-11-22
    相关资源
    最近更新 更多