Подтвердить что ты не робот

Сообщения сервис-брокера не отправляются, если целевая перезагрузка

На высоком уровне, вот что происходит:

  • У нас есть две системы SQL Server 2008 R2 SP1 (стандартная версия для Windows NT 6.1 (сборка 7601: с пакетом обновления 1)). Они напевают очень хорошо, обмениваясь двунаправленно, без ошибок или проблем.
  • Мы перезагружаем систему # 2, ожидая, что любые сообщения Service Broker, отправленные на нее, пока она недоступна, будут стоять в очереди на системе # 1, пока не вернется система № 2.
  • Система № 2 возвращается и все начинается нормально, без ошибок.
  • Сообщения, стоящие в очереди на систему № 1 для системы № 2, остаются в очереди; они никогда не отправляются. Кроме того, новые сообщения в этом разговоре также находятся в очереди и никогда не отправляются.
  • Сообщения, отправленные на новые разговоры, передаются просто отлично.

Сведения о сообщениях, которые никогда не отправляются:

а. В то время как система № 2 не работает, сообщение_передача для сообщений в очереди показывает различные ошибки, указывающие на то, что она не может взаимодействовать с системой # 2, как и ожидалось.

В. Вскоре после перезагрузки системы №2 передача данных для этих сообщений становится пустой. Состояние пустоты после этой точки не изменяется.

С. Разговор, в котором находятся сообщения, находится в состоянии CONVERSING/CO. Никакие столбцы в системном представлении не указывают, что что-то отличается от других очередей, которые работают нормально. (Если бы я мог найти какие-либо флаги, заданные по-разному, я бы знал, чтобы прекратить плохой разговор, но система не предлагает никаких подсказок - кроме постоянно растущей глубины очереди.)

Д. Сообщения никогда не принимаются в системе № 2 в том смысле, что моя хранимая процедура активации никогда не вызывается для этих сообщений.

Е. В Profiler (с включенными всеми типами следов брокера) хороший разговор показывает, что эти записи регистрируются:

Broker:Conversation CONVERSING  1 - SEND Message        Initiator                                       
Broker:Message Classify 2 - Remote  Initiator
[SQL Batch complete; SQL that caused the SEND to occur]
Broker:Remote Message Acknowledgement   1 - Message with Acknowledgement Sent   Initiator
Broker:Message Classify     1 - Local   Initiator
Broker:Conversation CONVERSING  6 - Received Sequenced Message  Target
Broker:Remote Message Acknowledgement   3 - Message with Acknowledgement Received       Initiator
Broker:Activation       Microsoft SQL Server Service Broker Activation  1 - Start

Сообщение, отправляемое, которое предназначено для застревания, показывает только первые два из этих событий:

Broker:Conversation CONVERSING  1 - SEND Message    Initiator
Broker:Message Classify 2 - Remote  Initiator

Насколько я могу судить, это все дальше. Нет никаких указаний на то, что SQL Server снова пытается передать их. Система №1 считает, что разговор по-прежнему хорош, но System # 2 полностью его забыла. Система №1 никогда, кажется, не понимает этого. Если мы впоследствии перезагрузим систему №1, то все вернется в норму, когда все мессаги текут по назначению.

Я подумал, что эти сообщения действительно отправлены, но подтверждение не возвращается к системе №1. Но я не вижу никаких доказательств резервных копий подтверждений.

Мы проверили множество типичных проблем с обеих сторон:

Брокер включен с обеих сторон. 2. Все очереди включены, при этом активируются все соответствующие функции (в очереди, получать). Очереди не отравлены. 3. Не существует проблем с разрешениями, о которых мы знаем. 4. Мы не используем огонь и забываем. 5. Мы повторно используем разговоры, как это рекомендуют различные люди. (На самом деле проблема повторного использования здесь является проблемой!) 6. Мы задерживаем SQL-исключения, используя транзакции в соответствии с инструкциями и т.д. 7. ssbdiagnose не возвращает ошибок.

Когда хост сервера SQL Server перезагружается, мы ожидаем, что все сообщения в очереди будут отправлены, но это не так. Что здесь происходит?

4b9b3361

Ответ 1

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

По какой-то причине инициатор отправил свои сообщения с одного IP-адреса, но другой IP был открыт для приема входящих ответов (и этот второй IP-адрес был указан в целевом маршруте).

Я обнаружил это случайно, действительно. Когда я попытался завершить разговор на целевой стороне, он не закрылся, но сообщение EndDialog появилось в sys.transmission_queue со статусом:

Ошибка подключения с ошибкой: '10060 (попытка подключения не удалось, потому что связанная сторона не ответила должным образом после период времени или установленное соединение не удалось, поскольку подключено хост не смог ответить.) '.

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