Очередь в WCF

В этом разделе описывается использование связи в очереди в Windows Communication Foundation (WCF).

Очереди как привязка транспорта в WCF

В WCF контракты указывают, что обменивается. Контракты — это обмен сообщениями, зависящий от бизнеса или специфики приложений. Механизм, используемый для обмена сообщениями (или «как это делается»), указывается в привязках. Привязки в WCF инкапсулируют сведения об обмене сообщениями. Они предоставляют настройки конфигурации для пользователя с целью управления различными аспектами транспорта или протокола, который представляют привязки. Очереди в WCF обрабатываются так же, как и другие виды транспортных привязок, что является большим преимуществом для многих систем очередей. Сегодня многие приложения очередей создаются иначе, чем другие распределенные приложения, использующие удаленные вызовы процедур (RPC), что затрудняет их понимание и обслуживание. При использовании WCF стиль написания распределенного приложения значительно отличается, что упрощает выполнение и обслуживание. Кроме того, учитывая механизм обмена отдельно от бизнес-логики, проще настроить транспорт или внести в него изменения, не затрагивая конкретный код приложения. На следующем рисунке показана структура службы WCF и клиента, использующих MSMQ в качестве транспортного средства.

Схема распределенных очередей приложений

Как видно на предыдущем рисунке, клиент и служба должны определять только семантику приложения, то есть контракт и реализацию. Служба настраивает привязку в очереди с предпочитаемыми параметрами. Клиент использует средство служебной программы метаданных ServiceModel (Svcutil.exe) для создания клиента WCF в службе и создания файла конфигурации, описывающего привязки для отправки сообщений в службу. Таким образом, чтобы отправить сообщение в очереди, клиент создает экземпляр клиента WCF и вызывает операцию на нём. Это приводит к отправке сообщения в очередь передачи и его перемещению в целевую очередь. Все сложности связи в очереди скрыты от приложения, отправляющего и получающего сообщения.

Предостережения о привязке в очереди в WCF включают:

  • Все операции службы должны быть односторонними, так как привязка по умолчанию в WCF не поддерживает дуплексное взаимодействие с помощью очередей. Пример двусторонней коммуникации (Two-Way коммуникации) иллюстрирует, как использовать два однонаправленных контракта для реализации двусторонней связи с использованием очередей.

  • Чтобы создать клиент WCF с помощью обмена метаданными, требуется дополнительная конечная точка HTTP в службе, чтобы ее можно было запрашивать непосредственно для создания клиента WCF и получения сведений о привязке для соответствующей настройки связи в очереди.

  • В зависимости от привязки в очереди требуется дополнительная конфигурация за пределами WCF. Например, класс, который поставляется с WCF, NetMsmqBinding требует настройки привязок, а также минимальной настройки очереди сообщений (MSMQ).

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

MSMQ

Транспорт в очереди в WCF использует MSMQ для связи с очередью.

MSMQ поставляется в качестве необязательного компонента с Windows и выполняется в качестве службы NT. Он записывает сообщения для их передачи в очередь передачи и для доставки в целевую очередь. Диспетчеры очередей MSMQ реализуют надежный протокол передачи сообщений, чтобы сообщения не терялись в передаче. Протокол может быть нативным или основанным на SOAP, например протокол надежных сообщений SOAP (SRMP).

В MSMQ очереди могут быть транзакционными или нетранзакционными. Транзакционная очередь позволяет захватывать и доставлять сообщения в рамках транзакции, а затем надежно хранить их в очереди. Сообщения, отправленные в транзакционную очередь, передаются ровно один раз в порядке очереди. Вы можете использовать очередь без транзакций для отправки как переменных, так и устойчивых сообщений. Сообщение, отправленное в очередь без транзакций, не несет никаких надежных гарантий передачи; Таким образом, сообщения могут быть потеряны.

Очереди MSMQ также можно защитить с помощью удостоверения Windows, зарегистрированного в службе каталогов Active Directory. При установке MSMQ можно установить интеграцию Active Directory, которая требует, чтобы компьютер был частью сети домена Windows.

Дополнительные сведения об MSMQ см. в статье об установке очереди сообщений (MSMQ).

NetMsmqBinding

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

NetMsmqBinding проявляет основные понятия очередей, рассмотренные до сих пор, в виде свойств в связях. Эти свойства, в свою очередь, сообщают MSMQ о способах передачи и доставки сообщений. Обсуждение категорий свойств приведено в следующих разделах. Дополнительные сведения см. в концептуальных разделах, описывающих конкретные свойства более полно.

Свойства "ExactlyOnce" и надёжности

Свойства ExactlyOnce и Durable влияют на то, как сообщения передаются между очередями.

  • ExactlyOnce: если задано значение true (по умолчанию), канал очереди гарантирует, что сообщение, если оно доставлено, не дублируется. Он также гарантирует, что сообщение не потеряно. Если сообщение не может быть доставлено или срок действия сообщения Time-To истекает до того, как оно будет доставлено, сообщение с ошибкой вместе с причиной сбоя доставки записывается в очередь недоставленных писем. Если задано значение false, канал очереди предпринимает усилия для передачи сообщения. В этом случае вы можете при желании выбрать очередь недоставленных писем.

  • Durable: Если задано значение true (по умолчанию), канал очереди гарантирует, что MSMQ сохраняет сообщение на диске. Таким образом, если служба MSMQ была остановлена и перезапущена, сообщения на диске передаются в целевую очередь или передаются в службу. Если задано значение false, сообщения хранятся в переменном хранилище и теряются при остановке и перезапуске службы MSMQ.

Для ExactlyOnce надежной передачи MSMQ требует, чтобы очередь была транзакционной. Кроме того, для MSMQ требуется транзакция для чтения из транзакционной очереди. Таким образом, при использовании NetMsmqBindingпомните, что транзакция требуется для отправки или получения сообщений, когда ExactlyOnce задано значение true. Аналогичным образом MSMQ требует, чтобы очередь не была транзакционной для предоставления гарантий по мере возможности, например, когда ExactlyOncefalse и для нестабильного обмена сообщениями. Таким образом, при установке ExactlyOnce в false или параметра долговечности в false, вы не можете отправлять или получать данные с помощью транзакции.

Замечание

Убедитесь, что правильная очередь (транзакционная или не транзакционная) создается на основе параметров в привязках. Если ExactlyOnce это trueтак, используйте транзакционные очереди; в противном случае используйте очередь, не связанную с транзакцией.

свойства очереди Dead-Letter

Очередь недоставленных писем используется для хранения сообщений, которые не были доставлены. Пользователь может написать компенсаторную логику, которая считывает сообщения из очереди недоставленных писем.

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

Если несколько клиентов, отправляя сообщения в разные целевые очереди, используют службу MSMQ, все сообщения, отправленные клиентами, отправляются в ту же очередь недоставленных сообщений. Это не всегда предпочтительнее. Для повышения изоляции WCF и MSMQ в Windows Vista предоставляют настраиваемую очередь недоставленных писем (или очередь недоставленных сообщений для конкретного приложения), которую пользователь может указать для хранения сообщений, которые завершаются сбоем доставки. Поэтому разные клиенты не делят одну и ту же очередь недоставленных писем.

Привязка имеет два свойства:

  • DeadLetterQueue: это свойство представляет собой перечисление, указывающее, запрашивается ли очередь недоставленных писем. Перечисление также содержит тип очереди недоставленных писем, если это требуется. Допустимые значения — None, System и Custom. Дополнительные сведения об интерпретации этих свойств см. в разделе "Использование очередей Dead-Letter для обработки сбоев передачи сообщений"

  • CustomDeadLetterQueue: это свойство является URI-адресом специфичной для приложения очереди недоставленных сообщений. Это необходимо, если DeadLetterQueue. Custom выбран.

Свойства обработки подозрительных сообщений

Когда служба считывает сообщения из целевой очереди в транзакции, служба может не обработать сообщение по различным причинам. Затем сообщение возвращается в очередь, чтобы снова читаться. Чтобы справиться с сообщениями, которые неоднократно завершаются сбоем, в привязке можно настроить набор свойств обработки сообщений с отравляющим сообщением. Существует четыре свойства: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelayи ReceiveErrorHandling. Дополнительные сведения об этих свойствах см. в разделе "Обработка ядовитых сообщений".

Свойства безопасности

MSMQ предоставляет собственную модель безопасности, например списки управления доступом (ACL) в очереди или отправку прошедших проверку подлинности сообщений. Эти свойства безопасности NetMsmqBinding предоставляются в рамках настроек транспортной безопасности. В привязке для обеспечения безопасности транспорта есть два свойства: MsmqAuthenticationMode и MsmqProtectionLevel. Параметры в этих свойствах зависят от настройки MSMQ. Дополнительные сведения см. в разделе "Защита сообщений с помощью безопасности транспорта".

Помимо безопасности транспорта фактические сообщения SOAP можно защитить с помощью безопасности сообщений. Дополнительные сведения см. в разделе "Защита сообщений с помощью безопасности сообщений".

MsmqTransportSecurity также предоставляет два свойства, MsmqEncryptionAlgorithm и MsmqHashAlgorithm. Это перечисления различных алгоритмов для использования при шифровании передачи сообщений между очередями и хэшировании подписей.

Другие свойства

Помимо предыдущих свойств, другие свойства MSMQ, предоставляемые в привязке, включают:

  • UseSourceJournal: свойство, указывающее, что включено ведение журнала источника. Журнал источника — это функция MSMQ, которая отслеживает сообщения, которые успешно передаются из очереди передачи.

  • UseMsmqTracing: свойство, указывающее, что трассировка MSMQ включена. Отслеживание MSMQ передает отчетные сообщения в очередь отчетов каждый раз, когда сообщение покидает или прибывает на машину, где размещен диспетчер очередей MSMQ.

  • QueueTransferProtocol: перечисление протокола, используемого для передачи сообщений между очередями. MSMQ реализует собственный протокол передачи очередей и SOAP-протокол под названием Протокол надежного обмена сообщениями (SRMP). SRMP используется при применении HTTP-транспорта для передачи данных от очереди к очереди. Защита SRMP используется при использовании HTTPS для передачи очередей в очередь.

  • UseActiveDirectory: Логическое значение, указывающее, следует ли использовать Active Directory для разрешения адресов очереди. По умолчанию это отключено. Дополнительные сведения см. в разделе "Конечные точки службы" и "Адресация очередей".

MsmqIntegrationBinding

Используется MsmqIntegrationBinding , если требуется, чтобы конечная точка WCF взаимодействовала с существующим приложением MSMQ, написанным на C, C++, COM или System.Messaging API.

Свойства привязки такие же, как у NetMsmqBinding. Однако применяются следующие различия:

  • Контракт операции для MsmqIntegrationBinding ограничивается принятием одного параметра типа MsmqMessage<T>, где этот параметр является типом тела.

  • Большая часть свойств собственного сообщения MSMQ предоставляется для MsmqMessage<T> использования.

  • Чтобы помочь в сериализации и десериализации текста сообщения, предоставляются сериализаторы, такие как XML и ActiveX.

Пример кода

Пошаговые инструкции по написанию служб WCF, использующих MSMQ, см. в следующих разделах:

Полный пример кода, демонстрирующий использование MSMQ в WCF, см. в следующих разделах:

См. также