2012-04-20 6 views
2

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

MSMQ Я предполагаю, что будет размещен на отдельном сервере.

Будет предоставлено 2 услуги WCF. Один для входящих сообщений, а другой для исходящих сообщений (принимает сообщение, выполняет ли какая-либо внутренняя обработка/проверка, затем помещает его в очередь исходящих сообщений или может отправлять электронную почту/текстовое сообщение/независимо)

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

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

НО во время обработки сообщения или через срок службы службы, что произойдет, если сервер сработает? Что делать, если сервер перезагружается? Что делать, если служба генерирует исключение по любой причине? Как можно не потерять это сообщение, но некоторые, как вернуть его в очередь, ожидая, что он будет обработан снова? Также как можно убедиться в том, что служба надежна таким образом, что она снова появится?

Буду признателен за любые советы и подробности здесь. Существует довольно много возможностей, и WCF/MSMQ предоставляет довольно много вариантов.

+0

Вместо этого вы можете использовать транзакции ... даже если что-то пойдет не так, либо все сообщения отправляются до сбоя, либо никто не отправляется. – Milee

ответ

9

Ваше предположение:

MSMQ Я думаю, будет размещен на отдельном сервере.

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

Будет предоставлено 2 услуги WCF. Один для входящих сообщений и другой для исходящих сообщений

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

Например, ваш ServiceA будет иметь локальную очередь, из которой он читает. ServiceB также имеет локальную очередь, из которой он читает. Если ServiceA хочет вызвать ServiceB, он поместит сообщение в локальную очередь ServiceB.

Я понимаю, с правильной конфигурации, мы можем иметь систему так , что это может быть транзакционные (никаких сообщений не теряются)

Это правильно.Это связано с тем, что MSMQ использует шаблон обмена сообщениями, называемый store-and-forward. См. here для пояснения.

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

  1. Первая транзакция: ServiceA пишет свою собственную временную локальную очередь. Если это не удается, транзакция откатывается, и ServiceA может обрабатывать исключение.
  2. Вторая транзакция: диспетчер очереди на машине ServiceA передает сообщение диспетчеру очереди на машине ServiceB. В случае сбоя сообщение остается во временной очереди.
  3. Третья транзакция: ServiceB считывает сообщение из локальной очереди. Если метод обработчика сообщений ServiceB генерирует исключение, транзакция пересылает сообщение обратно в локальную очередь.

Приложения/услуги будут многопоточной обработки сообщений

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

Я думал, что MSMQ может быть размещен отдельно и иметь серверы x share , что очередь?

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

Причина моего мышления состояла в том, что, если сервер опустился? Тогда как будут сообщения получить отправленные/полученную в MSMQ

Если очереди транзакционные то это означает, что сообщения о них сохраняются на диск. Если сервер опускается, тогда, когда он возвращается, сообщения все еще присутствуют. Пока сервер не работает, он явно не может участвовать в обмене сообщениями. Однако сообщения все равно могут «отправляться» на этот сервер - они остаются локальными для отправителя (во временной очереди), пока сервер назначения не вернется в оперативный режим.

так, имея один центральный сервер MSMQ (и с его зеркальным/восстановлением после отказа) тогда будет гарантируют безотказную работу

Всем смысл использование очереди сообщений является это отказоустойчивая транспорт, поэтому вам не нужно гарантировать время безотказной работы. Если у вас есть 100% -ная доступность, тогда будет мало оснований для использования очереди сообщений.

Каким образом WCF будет уведомлен о входящих сообщениях?

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

как будет служба уведомления о неудачах отправки сообщений

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

+0

Спасибо! Я ценю это. Я думал, что MSMQ можно размещать отдельно и иметь серверы x, разделяющие эту очередь? Причина моего мышления в том, что, если сервер опустится? Тогда как сообщения будут отправляться/получаться в MSMQ, готовые к тому, чтобы службы могли читать и писать? если они размещены на тех же серверах, что и службы WCF, то что, если этот сервер опустится? как он может читать/записывать в очередь, поэтому, имея один центральный сервер MSMQ (и имеющий зеркальное отображение/переход на другой ресурс), тогда будет гарантированность времени безотказной работы. –

+0

Хотя я не рассматривал это, но как WCF будет уведомлен о входящих сообщениях? или нужно создать приложение Windows/консольное приложение, к которому своевременно будет искать очередь, получить сообщение (ы) и вызвать службу WCF? как это работает? как служба будет уведомляться о сбоях отправки сообщений или о появлении нового сообщения в MSMQ? –

+0

См. Мое обновление –

0

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

Смежные вопросы