尝试发送 100 MB 批处理时出现 Azure 服务总线错误

Posted

技术标签:

【中文标题】尝试发送 100 MB 批处理时出现 Azure 服务总线错误【英文标题】:Azure Service Bus errors out when trying to send 100 MB batch 【发布时间】:2021-12-28 10:16:38 【问题描述】:

我正在尝试做一个 PoC 来测试 Azure Service Bus Premium 的最新功能,该功能可以处理大小为 100 MB 的消息。我尝试了两种模式。

    批量发送 3495253 条消息,累积消息 sizeInBytes 为 104857595。这绝对小于 100 MB 的限制。当我这样做时,我收到以下错误, System.InvalidOperationException: '链接'G5S2:196:amqps://sbpocbatching1.servicebus.windows.net/-c53a3e1c;0:5:6' 被代理强制分离,因为发布者(link82)收到了一个没有里面的数据。分离来源:Publisher。'

    如果我尝试在该批次中发送一条大小为 100MB 的消息,它会在 1 分钟后超时。

这是我的问题还是 Azure 的问题?我有一个非常好的互联网连接,显示 350 Mbps 下载和 300 Mbps 上传。

谁能解释一下我在这里错过了什么?

using System;
using System.Text;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

// connection string to your Service Bus namespace
string connectionString = "Endpoint=sb://sbpocbatching1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=czthvMkrDa6W34KrpfOHttKpEnuv90oWfAh6Z9tBpCM=";

// name of your Service Bus topic
string topicName = "mytopic";

// the client that owns the connection and can be used to create senders and receivers
ServiceBusClient client;

// the sender used to publish messages to the topic
ServiceBusSender sender;

// number of messages to be sent to the topic
int numOfMessages = 0;

//byte[] data = new byte[100 * 1024 * 1024];
//Random rng = new Random();
//rng.NextBytes(data);
string strdata = GenerateString();

    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Create the clients that we'll use for sending and processing messages.
    client = new ServiceBusClient(connectionString);
    sender = client.CreateSender(topicName);


    // create a batch 
    using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    //messageBatch.TryAddMessage(new ServiceBusMessage(strdata));
    for (numOfMessages = 0; numOfMessages <= 104857600; numOfMessages++)
    
        //if (messageBatch.SizeInBytes >= messageBatch.MaxSizeInBytes / 4)
        //    break;
        // try adding a message to the batch
        if (!messageBatch.TryAddMessage(new ServiceBusMessage(strdata)))
        
            // if it is too large for the batch
            //throw new Exception($"The message i is too large to fit in the batch.");
            break;
        
    

    try
    
        // Use the producer client to send the batch of messages to the Service Bus topic
        await sender.SendMessagesAsync(messageBatch);
        Console.WriteLine($"A batch of numOfMessages messages has been published to the topic.");
    
    finally
    
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await sender.DisposeAsync();
        await client.DisposeAsync();
    

    Console.WriteLine("Press any key to end the application");
    Console.ReadKey();

    GenerateString();



String GenerateString()

    int length = 1;
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < length; i++)
    
        sb.Append("A");
    

    return sb.ToString();


【问题讨论】:

虽然总大小不到 100MB,但一批 3,495,253 条消息听起来像是一个值得研究的问题点。 @SeanFeldman:感谢您的回复。没有记录在案的批次中有大量消息的实例。否则,Microsoft 应该告诉我们批次中可接受的计数是多少。此外,正如您所指出的,我在一条消息中发送所有 100 MB 的第二个选项也永远不会通过。我的网速很好,上下 300 Mbps。 批处理中的消息数量存在限制,文档目前没有很好地突出显示 - 但内容作者正在努力解决这些问题。 SDK 无法预先验证这一点,因为该限制当前未暴露在服务之外。更多上下文可以在这里找到:github.com/Azure/azure-sdk-for-net/issues/21451 【参考方案1】:

由于这是github 中的一个未解决问题,

如果我尝试在该批次中发送一条大小为 100MB 的消息,它会在 1 分钟后超时。

你可以增加 TryTimeout:

 client = new ServiceBusClient(connectionString, new ServiceBusClientOptions

    RetryOptions = new ServiceBusRetryOptions()  TryTimeout = TimeSpan.FromMinutes(5)
);

批量发送 3495253 条消息,累积消息 sizeInBytes 为 104857595。这绝对小于 100 MB 的限制。当我这样做时,我收到以下错误 System.InvalidOperationException: '链接'G5S2:196:amqps://sbpocbatching1.servicebus.windows.net/-c53a3e1c;0:5:6' 被经纪人强制分离因为发布者(link82)收到了一条没有数据的批处理消息。分离来源:Publisher。'

正如@JoshLove-msft 所建议的那样,仍然不确定该服务强制执行的消息限制以及有关此问题的讨论。

【讨论】:

谢谢。你提到的问题是我提出的:)。我在 github 和 *** 中都发布了这个问题。我是提出它的同一个人。

以上是关于尝试发送 100 MB 批处理时出现 Azure 服务总线错误的主要内容,如果未能解决你的问题,请参考以下文章

上传到 Azure 存储时出现内部 500 错误

无法通过 asp.net 核心服务器端将 ~200mb 文件上传到 azure blob 存储

尝试访问 Azure Databricks 中的 Azure DBFS 文件系统时出现挂载错误

使用Gmail API时出现BrokenPipeError

使用 Gmail API 发送大型附件时出现错误 10053

Azure 功能:访问存储帐户时出现 403 错误