NServiceBus отправка данных вопроса - PullRequest
1 голос
/ 20 апреля 2010

Я использую NServices для отправки объекта класса MyMusicMessage в качестве удара:

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

когда размер MusicBytes составляет около 200 КБ, его можно отправить хорошо.

, но если размер превышает 300 КБ, возникает «MessageQueueException».

есть ли ограничение на размер объекта в NServiceBus?

спасибо.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

Одна вещь, которую я заметил при передаче полезной нагрузки (намного меньшей) в виде байтового массива, заключается в том, что NServiceBus будет сериализовать ее примерно так (из памяти):

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

Очевидно, что это не лучший способ для эффективной передачи байтового массива, но я уверен, что сериализатор NServiceBus стремится к скорости и эффективности, а не к наименьшему возможному размеру сообщения.

Хотя я согласен с тем, что было бы лучше передать что-то столь же здоровенное, как музыкальные данные, вне полосы частот, для полезных нагрузок меньшего массива байтов (например, в диапазоне 5-10 КБ), гораздо лучшей альтернативой является кодирование массива байтов в виде строки Base64. в вашем классе сообщений, используя Convert.ToBase64String(byte[] arr) и Convert.FromBase64String(string str).

1 голос
/ 21 апреля 2010

При использовании сериализатора XML в NServiceBus (который используется по умолчанию) он сериализует массивы как коллекции общего назначения, создавая запись для каждого значения. Вероятно, именно поэтому фактический размер сообщения намного превышает 300 КБ в памяти.

Я предлагаю вам переключиться на двоичный сериализатор для этого типа сообщения.

0 голосов
/ 20 апреля 2010

MSMQ имеет ограничение 4M. Мы работаем над функцией шины данных для 2.1, но до тех пор, я полагаю, что вы сохраняете свои музыкальные данные «вне диапазона» и передаете адрес только в том случае, если данные могут быть получены в вашем сообщении.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...