Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Azure服务总线失败,出现NOTFOUND异常_Node.js_Azure_Azure Functions_Azureservicebus - Fatal编程技术网

Node.js Azure服务总线失败,出现NOTFOUND异常

Node.js Azure服务总线失败,出现NOTFOUND异常,node.js,azure,azure-functions,azureservicebus,Node.js,Azure,Azure Functions,Azureservicebus,我正在迭代400000条json消息,这些消息需要从我的NodeJS Azure函数发送到Azure服务总线。该函数可以创建主题,并开始发布消息 它开始遍历循环并发布消息。在发布失败并出现以下错误之前,我看到队列中有几千个land: { Error: getaddrinfo ENOTFOUND ABC.servicebus.windows.net ABC.servicebus.windows.net:443 at errnoException (dns.js:53:10) at Get

我正在迭代400000条json消息,这些消息需要从我的NodeJS Azure函数发送到Azure服务总线。该函数可以创建主题,并开始发布消息

它开始遍历循环并发布消息。在发布失败并出现以下错误之前,我看到队列中有几千个land:

{ 
    Error: getaddrinfo ENOTFOUND ABC.servicebus.windows.net ABC.servicebus.windows.net:443 at errnoException (dns.js:53:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:95:26)
    code: 'ENOTFOUND',
    errno: 'ENOTFOUND',
    syscall: 'getaddrinfo',
    hostname: 'ABC.servicebus.windows.net',
    host: 'ABC.servicebus.windows.net',
    port: '443' 
}
我发布消息的代码编写了一条消息,并将其推送到JSAPI中。消息主体是一个小JSON对象:

{
    "adult":false,
    "id":511351,
    "original_title":"Nossa Carne de Carnaval",
    "popularity":0,
    "video":false
}
my Azure函数中将此消息推送到服务总线的方法如下:

function publishNewMovies(context, movies) {
    var azure = require('azure');
    var moment = require('moment');

    var topic = process.env["NewMovieTopic"];
    var connectionString = process.env["AZURE_SERVICEBUS_CONNECTION_STRING"];

    context.log("Configuring Service Bus.");
    return new Promise((resolve, reject) => {
        var serviceBusService = azure.createServiceBusService(connectionString);
        serviceBusService.createTopicIfNotExists(topic, function(error) {
            if (error) {
                context.log(`Failed to get the Service Bus topic`);
                reject(error);
            }

            context.log("Service Bus setup.");

            // Delay the receiving of these messages by 5 minutes on any subscriber.
            var scheduledDate = moment.utc();
            scheduledDate.add('5', 'minutes');
            context.log("Sending new movie messages.");

            var message = {
                body: '',
                customProperties: { 
                    messageNumber: 0
                },
                brokerProperties: {
                    ScheduledEnqueueTimeUtc: scheduledDate.toString()
                }
            }

            for(index = 0; index < movies.length; index += 40) {
                message.brokerProperties.ScheduledEnqueueTimeUtc = scheduledDate.add('11', 'seconds').toString();
                for(batchIndex = 0; batchIndex < 40; batchIndex++) {
                    var currentIndex = index + batchIndex;
                    if (currentIndex >= movies.length) {
                        break;
                    }

                    message.customProperties.messageNumber = currentIndex;
                    message.body = JSON.stringify(movies[currentIndex]);

                    serviceBusService.sendTopicMessage(topic, message, function(error) {
                        if (error) {
                            context.log(`Failed to send topic message for ${message.body}: ${error}`);
                            reject(error);
                        }
                    })
                }
            }
        });
    });
}
这将创建一条从第一次服务总线推送开始5分钟内可见的消息。然后我在计划的时间内批量发送40条消息。第一批完成后,我计划在11秒后再发送40条消息。这是因为将要编写的另一个Azure函数将侦听此服务总线主题并发出第三方API请求。我被限制每10秒发送40条信息

我已经通读了Azure函数,看起来我可能达到了10000个主题/队列限制。有了这个限制,一个人怎么能把大量的信息推到总线上呢?当我发送相同的消息时,设置多个名称空间来解决这个问题似乎是倒退的,只是内容不同——它属于同一名称空间。我收到的错误并不表示我达到了极限或任何东西。由于某种原因,它似乎无法找到实际的服务总线端点

解决这个问题的办法是处理分区吗?我找不到关于如何使用NodeJs处理分区的文档。他们的大多数API文档都是用C编写的,这对我来说并没有很好地转换成NodeJs

编辑以显示总线度量 总线度量

主题度量

你能详细解释一下你为什么要创建这么多的主题吗? 这: var topic=process.env[NewMovieTopic]

您可以有一个主题,它可以获取数百万条消息,然后这些消息将被传输到各个订阅,您还可以添加过滤条件。所以不应该有那么多的话题


通常,主题、订阅和队列将在管理平面门户、arm、PS或cli运行时中创建,或者数据操作将是函数、云应用、虚拟机、,因此,除非您有创建这些主题的非常具体的原因,否则Service bus可能可以轻松地处理您的卷?

请查看Azure Service bus portal,了解有关主题数量、主题大小、消息数量等的详细信息。此外,您还可以使用其指标监控您的资源。在基本层和标准层,每个命名空间的主题实体数似乎达到10000个。您将所有消息发送到同一个主题,因此10000个主题实体数不适用于您。单个主题可以包含数百万条受最大大小(默认为1GB)限制的消息。你的函数运行时间不是超过5分钟吗?@JohnathonSullinger,我想更正我之前的评论。Mikhail是正确的,根据您的代码,您的AF使用的是应用程序设置中配置的单个主题名称。您的json对象非常小,假设~2kb,那么400000条消息x2K小于1GB,这是主题/队列实体的默认大小。我认为,指标监控可以为您提供更详细的情况,以及何时发生。尝试更改主题名称并再次运行。Azure Metrics不会向我显示发生错误以外的任何详细信息。函数没有超时,因为在抛出错误之前,它正在运行不到10秒。主题上的度量没有显示任何故障,而总线度量显示单个错误;没有提供详细信息。该代码正在创建单个主题(如果它不存在的话)。如果一个主题已经存在,则不会重新创建它。只有一个主题曾经存在。