最大CloudQueueMessage负载大小问题
本文关键字:问题 负载 CloudQueueMessage 最大 | 更新日期: 2023-09-27 18:01:13
根据MSDN,消息有效负载可能扩展到8KB(8192字节(:
AddMessage方法将消息添加到队列的后面。一条消息的大小可能高达8 KB。其内容必须采用可以使用UTF-8编码的格式。
然而,当将消息添加到队列中时,我会收到消息的异常,这些消息的有效负载应该小于8192字节,神奇的区域似乎在6500字节左右。我发送的数据是纯字符串,其大小通过.Length
成员和从中检索数据的源发送的长度来验证(CRLF分隔符有恒定的2字节差异(。
所以我的问题有两个:
1( 是否有任何隐藏的数据附加到消息有效负载,会使其大小膨胀或导致这种奇怪的行为?(例如应用于整个对象的限制,而不仅仅是它的有效载荷,即使这样,它怎么能占每条消息1.5KB?(
2( 我如何可靠地检查有效载荷是否确实低于8192?
以及一些额外的信息:我正在使用带有VS 2010 Ultimate的Azure SDK 1.4,运行通过计算&存储模拟器(我还没有部署这个应用程序(使用SQLExpress(我认为是2008年(。
还通过代码确认,最大大小为8192字节(在一些额外的系统限制的情况下(:
Trace.WriteLine("Max Queue Message Size: " + CloudQueueMessage.MaxMessageSize, "CloudQueueMessage");
CloudQueueMessage:最大队列消息大小:8192
。NET存储客户端库(Microsoft.WindowsAzure.StorageClient.dll(的base-64-encodes队列消息内容,因此使用时的有效限制为8192*.75=6144字节。NET客户端库。(这是因为基本64编码增加了1/3的开销。(
(请注意,没有以64为基础进行编码。这恰好是该库确保队列消息的内容可以安全地嵌入XML的方式,而XML正是队列服务对消息的要求。(
编辑:下面是使用Microsoft的示例代码。WindowsAzure。StorageClient。将原始文本(非64位编码(放入队列消息(并随后检索(的协议命名空间:
using System;
using System.Net;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.StorageClient.Protocol;
class Program
{
static void Main(string[] args)
{
var q = CloudStorageAccount.Parse("UseDevelopmentStorage=true").CreateCloudQueueClient().GetQueueReference("testqueue");
q.CreateIfNotExist();
var req = QueueRequest.PutMessage(new Uri(q.Uri, q.Name + "/messages"), 30, null);
var body = QueueRequest.GenerateMessageRequestBody("hello world");
req.ContentLength = body.Length;
q.ServiceClient.Credentials.SignRequest(req);
using (var stream = req.GetRequestStream())
{
stream.Write(body, 0, body.Length);
stream.Close();
}
req.GetResponse();
req = QueueRequest.GetMessages(new Uri(q.Uri, q.Name + "/messages"), 30, 32, null);
q.ServiceClient.Credentials.SignRequest(req);
using (var response = (HttpWebResponse)req.GetResponse())
{
using (var msgResponse = QueueResponse.GetMessages(response))
{
foreach (var msg in msgResponse.Messages)
{
Console.WriteLine("MESSAGE: " + msg.Text);
q.DeleteMessage(msg.Id, msg.PopReceipt);
}
}
}
q.Delete();
}
}