1

我正在使用 NServices 发送 MyMusicMessage 类的对象作为打击:

[Serializable]
public class MyMusicMessage:IMessage
{
    public Guid EventId { set; get; }
    public byte[] MusicBytes { set; get; }
}

当 MusicBytes 的大小在 200k 左右时,可以很好地发送。

但是当大小超过 300K 时,就会出现“MessageQueueException”。

NServiceBus 中的对象大小是否有限制?

谢谢。

4

3 回答 3

2

在将(小得多的)有效负载作为字节数组传输时,我注意到的一件事是 NServiceBus 将大致像这样(从内存中)序列化它:

<MyByteArray>
    <Byte>4</Byte>
    <Byte>183</Byte>
    <Byte>221</Byte>
    <Byte>87</Byte>
    ...
<MyByteArray>

显然不是有效传输字节数组的好方法,但我确信 NServiceBus 序列化程序是为了速度和效率,而不是尽可能小的消息大小。

虽然我同意最好将音乐数据等大量数据传输到带外,但对于较小的字节数组有效负载(如 5-10K 范围),更好的选择是将字节数组编码为消息中的 Base64 字符串类使用Convert.ToBase64String(byte[] arr)and Convert.FromBase64String(string str)

于 2010-04-27T19:14:22.747 回答
1

在 NServiceBus 中使用 XML 序列化程序(这是默认值)时,它将将数组序列化为通用集合,为每个值创建一个条目。这很可能是导致实际消息大小远大于内存中的 300KB 的原因。

我建议您切换到该消息类型的二进制序列化程序。

于 2010-04-21T05:26:20.227 回答
0

MSMQ 有 4M 的限制。我们正在为 2.1 开发数据总线功能,但在此之前,我建议您将音乐有效负载“带外”存储,并且只传输可以在您的消息中提取数据的地址。

希望这可以帮助!

于 2010-04-20T12:23:17.583 回答