На высоком уровне, вот что происходит:
- У нас есть две системы 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 перезагружается, мы ожидаем, что все сообщения в очереди будут отправлены, но это не так. Что здесь происходит?