我正在使用NServices发送MyMusicMessage类的对象作为打击:
[Serializable]
public class MyMusicMessage:IMessage
{
public Guid EventId { set; get; }
public byte[] MusicBytes { set; get; }
}
当MusicBytes的大小约为200k时,可以很好地发送。
但是当大小超过300K时,会出现“MessageQueueException”。
NServiceBus中的对象大小有限制吗?
感谢。
答案 0 :(得分:2)
在将(小得多)有效负载作为字节数组传输时,我注意到的一件事是NServiceBus将大致像这样(从内存)序列化它:
<MyByteArray>
<Byte>4</Byte>
<Byte>183</Byte>
<Byte>221</Byte>
<Byte>87</Byte>
...
<MyByteArray>
显然,这不是一种有效传输字节数组的好方法,但我确信NServiceBus序列化程序的速度和效率要高,而不是最小的消息大小。
虽然我同意最好将带外的音乐数据转移到带外,对于较小的字节数组有效载荷(如5-10K范围),更好的选择是将字节数组编码为Base64字符串在您的邮件类中使用Convert.ToBase64String(byte[] arr)
和Convert.FromBase64String(string str)
。
答案 1 :(得分:1)
在NServiceBus中使用XML序列化程序(这是默认设置)时,它会将数组序列化为通用集合,为每个值创建一个条目。这可能是导致实际消息大小远大于内存中300KB的原因。
我建议您切换到该消息类型的二进制序列化程序。
答案 2 :(得分:0)
MSMQ的限制为4M。我们正在研究2.1的数据总线功能,但在此之前我认为您将音乐有效负载存储在“带外”,并且只传输可以在您的消息中获取数据的地址。
希望这有帮助!