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

(はるかに小さい)ペイロードをバイト配列として転送するときに気づいたことの 1 つは、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)

于 2010-04-27T19:14:22.747 に答える
1

NServiceBus (デフォルト) で XML シリアライザーを使用すると、配列が汎用コレクションとしてシリアル化され、各値のエントリが作成されます。これが、実際のメッセージ サイズがメモリ内の 300KB よりもはるかに大きくなる原因である可能性があります。

そのメッセージ タイプの Binary シリアライザに切り替えることをお勧めします。

于 2010-04-21T05:26:20.227 に答える
0

MSMQ には 4M の制限があります。2.1 のデータバス機能​​に取り組んでいますが、それまでは音楽ペイロードを「帯域外」に保存し、メッセージでデータを取得できるアドレスのみを転送することをお勧めします。

お役に立てれば!

于 2010-04-20T12:23:17.583 に答える