Azure Service Bus主题 - 使用Node.js SDK

时间:2016-01-06 19:47:44

标签: node.js azure servicebus

我正在使用最新的可用npm包试验Azure Node.js SDK和Service Bus Topics - 0.10.6(https://www.npmjs.com/package/azure)。 我想发布一条新消息并使用以下代码接收它:

var azure = require('azure');

var connectionString = "Endpoint=sb://sfbustest.servicebus.windows.net/;SharedAccessKeyName={key-name};SharedAccessKey={access-key}";
var topicName = "{topic-name}";
var subscriptionName = "{subscription-name}";

var serviceBusService = azure.createServiceBusService(connectionString);

serviceBusService.getSubscription(topicName, subscriptionName, function(error, subscription){
        //if(error) return callback(error);
        if(!subscription){
            serviceBusService.createSubscription(topicName, subscriptionName, function (error) {
                if (error) throw error;

                postMessage_retreiveMessage(null);
            });
        } else {
            postMessage_retreiveMessage(null);
        }

    });

//postMessage_retreiveMessage();
function postMessage_retreiveMessage(){
    var topicMsg = {
        body: new Date().toISOString()
    };

    serviceBusService.sendTopicMessage(topicName, topicMsg, function (error) {
        if(error) throw error;

        console.log("message sent: ");
        console.log(topicMsg);

        var receiveOptions = { /* isPeekLock: true, */ timeoutIntervalInS: 30 };

        serviceBusService.receiveSubscriptionMessage(topicName, subscriptionName, receiveOptions, function(error, receivedMessage){
            if(error) throw error;

            console.log("message received: ");
            console.log(receivedMessage);
        });
    });
}

问题: 创建主题并启用分区 - 如果通过管理门户创建主题,则默认为 - 在这种情况下,我在最终收到消息之前经历了巨大的延迟。

但是,使用.NET SDK无法重现此行为。

此外,如果分区已关闭,则我不会再遇到任何重大延迟,并且行为也不再可重现。

查看Azure SDK for Node.js我注意到调用了以下端点(调用receiveSubscriptionMessage时):

https://sfbustest.servicebus.windows.net:443/{topic-name}/Subscriptions/{subscription-name}/Messages/Head?timeout=30&api-version=2013-10.

其文档可在此处获取:https://msdn.microsoft.com/en-us/library/azure/hh780770.aspx。 在文档的介绍部分中,声明HTTP API支持分区实体:https://msdn.microsoft.com/en-us/library/azure/dn798895.aspx

如果我用Fiddler手动调用该终点,我也会观察到所描述的延迟。

如果有人能帮我理解造成这种行为的原因,我将非常感激。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

尝试Use sessions with partitioned entities。 在我的测试中,在消息中添加sessionId后,延迟平均降至2秒。

E.G。

 var topicMsg = {
        body: new Date().toISOString(),
        brokerProperties:{
            SessionId:'mysession'
        }
    };

答案 1 :(得分:0)

好像您正在使用依赖于HTTP REST API的旧版azure-sb包。我建议使用更新的@azure/service-bus程序包,该程序包使用更快的AMQP实现,并且不会发现导致延迟的呼叫

答案 2 :(得分:0)

我知道这是一个较晚的答复,但是以防万一有人遇到旧的服务总线节点SDK的问题并降落在此处,请参阅下面的链接。

@azure/service-bus的最新版本7.0.0(基于AMQP-速度更快/性能更好)已经发布。