Обеспечивает ли msmq целостность данных в транзакционных очередях?
Я использую MSMQ для передачи byte
массив.
Форматтер является BinaryMessageFormatter
,
Очередь назначения является частной, и я использую прямую связь по TCP.
Машина назначения находится в другой локальной сети, доступ к ней осуществляется по ее внешнему IP-адресу.
Существует брандмауэр, который направляет входящее TCP-соединение на фактическую машину назначения (переадресация портов).
Итак, архитектура системы выглядит так:
[исходный компьютер] -> [целевой брандмауэр] -> [целевой компьютер]
Я использую систему в течение нескольких месяцев, и все прошло нормально.
Недавно у нас произошел сбой брандмауэра.
По-видимому, это вызвало повреждение данных:
В то время как очередь является транзакционной, и сообщение, согласно MSMQ, было успешно доставлено на конечный компьютер, содержимое сообщения было повреждено.
То есть код для чтения сообщения из очереди вызвал исключение:
try
{
var message = queue.Receive(readTimeout, transaction);
if (message != null)
{
data = (byte[]) message.Body; // this line raises an exception
return true;
}
}
catch (Exception e)
{
Logger.Error("error reading queue", e);
}
Мне пришлось удалить несколько сообщений из (верхней части) очереди, а затем система вернулась в нормальное состояние.
Мой вопрос:
Если предположить, что это было вызвано только отказом брандмауэра, и, зная, что это транзакционная очередь, почему сообщение считается доставленным?
Разве MSMQ не выполняет какую-то контрольную сумму для обеспечения целостности данных в транзакционных очередях?
2 ответа
В настоящее время похоже, что MSMQ полностью "доверяет" уровню TCP, когда речь заходит о целостности и полноте данных.
Это всего лишь предположение, но я думаю, что у координатора распределенных транзакций (DTC) могут возникнуть проблемы. Как следует из названия, DTC отвечает за обработку транзакций, которые включают несколько систем в сети.
В вашем сценарии я могу представить, что транзакции не могут быть правильно обработаны в разных локальных сетях.
Я предлагаю вам проверить конфигурации задействованных экземпляров DTC в обеих сетях, если есть возможность включить связь между ними и / или исследовать, нужно ли настроить межсетевой экран для разрешения связи DTC.