Ваше предположение:
MSMQ Я думаю, будет размещен на отдельном сервере.
является неправильным. MSMQ устанавливается на всех машинах, которые хотят участвовать в очередности сообщений.
Будет предоставлено 2 услуги WCF. Один для входящих сообщений и другой для исходящих сообщений
В наиболее типичной конфигурации, очередь назначения являются локальными для службы прослушивания.
Например, ваш ServiceA будет иметь локальную очередь, из которой он читает. ServiceB также имеет локальную очередь, из которой он читает. Если ServiceA хочет вызвать ServiceB, он поместит сообщение в локальную очередь ServiceB.
Я понимаю, с правильной конфигурации, мы можем иметь систему так , что это может быть транзакционные (никаких сообщений не теряются)
Это правильно.Это связано с тем, что MSMQ использует шаблон обмена сообщениями, называемый store-and-forward. См. here для пояснения.
По существу, можно с уверенностью предположить, что потеря сообщений не связана с тем, что передача сообщения с одной машины на другую происходит фактически в трех различных транзакциях.
- Первая транзакция: ServiceA пишет свою собственную временную локальную очередь. Если это не удается, транзакция откатывается, и ServiceA может обрабатывать исключение.
- Вторая транзакция: диспетчер очереди на машине ServiceA передает сообщение диспетчеру очереди на машине ServiceB. В случае сбоя сообщение остается во временной очереди.
- Третья транзакция: ServiceB считывает сообщение из локальной очереди. Если метод обработчика сообщений ServiceB генерирует исключение, транзакция пересылает сообщение обратно в локальную очередь.
Приложения/услуги будут многопоточной обработки сообщений
Это хорошо, за исключением, если вам требуется порядка должны быть сохранены в цепочке обработки сообщений. Если вам нужна упорядоченная обработка, у вас не может быть нескольких потоков без реализации повторного секвенсора для повторного заказа.
Я думал, что MSMQ может быть размещен отдельно и иметь серверы x share , что очередь?
У всех серверов, которые хотят участвовать в обмене сообщениями, установлен MSMQ. Затем каждый сервер может записывать в любую очередь на любом другом сервере.
Причина моего мышления состояла в том, что, если сервер опустился? Тогда как будут сообщения получить отправленные/полученную в MSMQ
Если очереди транзакционные то это означает, что сообщения о них сохраняются на диск. Если сервер опускается, тогда, когда он возвращается, сообщения все еще присутствуют. Пока сервер не работает, он явно не может участвовать в обмене сообщениями. Однако сообщения все равно могут «отправляться» на этот сервер - они остаются локальными для отправителя (во временной очереди), пока сервер назначения не вернется в оперативный режим.
так, имея один центральный сервер MSMQ (и с его зеркальным/восстановлением после отказа) тогда будет гарантируют безотказную работу
Всем смысл использование очереди сообщений является это отказоустойчивая транспорт, поэтому вам не нужно гарантировать время безотказной работы. Если у вас есть 100% -ная доступность, тогда будет мало оснований для использования очереди сообщений.
Каким образом WCF будет уведомлен о входящих сообщениях?
Каждый сервис будет прослушивать свою собственную локальную очередь. Когда приходит сообщение, среда выполнения WCF вызывает вызов метода обработки и обрабатываемого сообщения.
как будет служба уведомления о неудачах отправки сообщений
Если ServiceA не удается передать сообщение ServiceB тогда ServiceB никогда не будет уведомлен об этом неудаче. И не должно быть. ServiceA будет обрабатывать отказ для передачи, а не ServiceB. Ваше ожидание в этом случае создает жесткую связь между службами, что-то, что должно быть удалено из очереди сообщений.
Вместо этого вы можете использовать транзакции ... даже если что-то пойдет не так, либо все сообщения отправляются до сбоя, либо никто не отправляется. – Milee