Дизайн большого объема MSMQ

У нас много коммуникационных серверов, отправляющих пакеты данных. Мы хотели бы хранить эти пакеты данных, поступающие от этих серверных программ, в MSMQ до тех пор, пока средство обновления не будет их обрабатывать. Потеря данных была проблемой, и мы хотели бы не потерять какой-либо пакет данных, поступающий от этих серверных программ, и хотим получить эффективное и производительное решение.

Какой будет лучший дизайнерский подход?

2 ответа

Решение

Ну, есть две основные вещи, которые нужно сделать, чтобы начать. Во-первых, вы захотите изменить установку по умолчанию, чтобы переместить место хранения на диск с зеркальным копированием и / или не совпадающий с тем, с которого загружается операционная система на этом сервере. Также вы захотите убедиться, что там достаточно места для хранения сообщений в очереди, в зависимости от объема, который вы планируете. Эта статья покрывает это.

Во-вторых, вы захотите использовать транзакции и ведение журнала для обеспечения надежности. Это проблема как программирования, так и инфраструктуры, поэтому вы можете начать с просмотра этой статьи, а затем ознакомиться с общим руководством о том, как правильно программировать на MSMQ. Это, например, хорошая отправная точка, если вы никогда не использовали MSMQ, хотя это довольно просто. Если вы собираетесь использовать MSMQ в качестве привязки / транспорта для WCF, то у вас есть практически все, что касается сантехнической части; это всего лишь вопрос настройки ваших сервисов для обработки объема и трафика, которые вы ожидаете увидеть.

У нас много коммуникационных серверов, отправляющих пакеты данных.

При хранении "пакетов данных" я бы порекомендовал записать [Serializable].NET объекты в WCF, главным образом потому, что WCF может прозрачно читать / записывать их в MSMQ. С этим будет легче работать, но если ваши пакеты данных, скажем, TCP/IP или бинарные пакеты, вам нужно будет включить "Порядок", чтобы убедиться, что они попадают в очередь в том порядке, в котором они были размещены.

MSMQ также имеет сессии, так что если вы хотите сгруппировать элементы вместе, это возможно. WCF не дает этой гарантии. Вам нужно будет написать собственный код для этого, но это всего лишь случай назначения уникального идентификатора каждому сообщению в конкретном сеансе.

Потеря данных была проблемой, и мы хотели бы не потерять какой-либо пакет данных, поступающий от этих серверных программ

MSMQ может сохранять данные на диск, поэтому, если сервер выходит из строя, его очередь сохраняется. MSMQ может хранить очередь в памяти, что более эффективно, но сбой / перезапуск не сохранит информацию об очереди.

и хочу эффективно (хорошая производительность)

MSMQ довольно производительный. Постоянство на диске имеет небольшие издержки, но только из-за записи на диск. Если производительность включает многопоточность, MSMQ не предлагает эту функцию, поскольку очередь является последовательной, поэтому ее необходимо обрабатывать по порядку. Но это типично для технологий очереди.

MSMQ также имеет максимальный размер сообщения 4 МБ, поэтому имейте в виду, что вы хотите отправить по сети.

Единственное, что MSMQ не масштабируется. Его основной целью является гарантированная доставка. Если вы отправите миллионы пакетов, они попадут в пункт назначения, но MSMQ имеет ограниченную возможность передавать сообщения на другие машины. Он работает как ThreadPool-подобная система, поэтому не будет масштабироваться, если это также является требованием.

Я также добавил информацию в #msmq-wcf wiki с базовым примером записи данных.

Другие вопросы по тегам