Как работает MSMQ Transactional Message Delivery? - PullRequest
8 голосов
/ 04 октября 2011

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

Предположим, у меня есть две машины, A и B.

Машина A имеет транзакционную очередь, которая используется для получения сообщений. Служба Windows контролирует эту очередь и что-то делает с данными (сохраняет их на SQL-сервере). На компьютере B запущено приложение, которое должно записать в очередь на компьютере A.

Несколько вопросов:

  1. При отправке сообщения создается ли локальная копия на компьютере B до ее доставки на компьютер A?
    а. Если это так, является ли это поведение по умолчанию или оно происходит только при отправке свойства IsRecoverable?
    б. Влияет ли на это поведение тот факт, что очередь является транзакционной?

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

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

1 Ответ

6 голосов
/ 04 октября 2011

Главное, что нужно понять о транзакционном MSMQ, - это то, что на самом деле в транзакции передачи сообщения в удаленную очередь участвуют 3 отдельные транзакции.

  1. Отправитель записывает сообщение в локальную временную очередь.
  2. Администратор очередей на машине отправителя передает сообщение по проводной связи администратору очередей на машине получателя.
  3. Служба получателя обрабатывает сообщение очереди, а затем удаляет сообщение из очереди.

Итак, в ответ на ваши вопросы:

При отправке сообщения создается локальная копия на компьютере B, перед он доставляется на машину A?

Да

Если это так, является ли это поведение по умолчанию, или это происходит только когда Свойство IsRecoverable отправлено?

По умолчанию. Это то, что известно как store и forward .

Влияет ли на это тот факт, что очередь является транзакционной? поведение?

Нет, за исключением случаев, когда происходит сбой.

Поскольку я использую транзакционную очередь, где данные, как только транзакция совершается?

Это зависит от того, какую транзакцию вы имеете в виду (см. Выше)

Он сидит локально, ожидая, пока служба msmq доставит сообщение в удаленную очередь?

Только если удаленная очередь недоступна.

Или сообщение находится в очереди на удаленном компьютере?

Если службе получателя не удалось успешно обработать сообщение (в обработчике есть исключение), сообщение останется в удаленной очереди.

...