Обеспечивает ли 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.

Другие вопросы по тегам