Компонент Service Broker: Sys.Conversation_endpoints заполняется сообщениями CO / CONVERSING при использовании с очисткой - PullRequest
4 голосов
/ 10 августа 2010

Недавно мы обнаружили проблему с одной из наших баз данных, когда в результате настройки «пожар и забыл» (т. Е. Разговоры закрываются сразу после отправки), наша таблица sys.conversation_endpoints заполнялась сообщениями DI / DISCONNECTED_INBOUND. Это в конечном итоге перетекло в базу данных tempDB, что привело к ее огромному росту и поглощению драгоценного дискового пространства. В конце концов мы решили эту проблему, закомментировав строку

END CONVERSATION @handle WITH CLEANUP

в нашем отправляющем SP и закрытии разговоров в нашем принимающем SP, используя тот же код,

END CONVERSATION @handle WITH CLEANUP

Однако теперь у нас есть новая проблема. После перемещения серверов (и перехода с SQL Server 2005 на SQL Server 2008) мы недавно обнаружили, что sys.conversation_endpoints теперь заполняется сообщениями CO / CONVERSING, указывающими, что диалоги не закрываются. Получающий SP закрывает их или, по крайней мере, запускает команду для этого, поэтому я не понимаю, откуда поступают эти сообщения.

Я пытался вернуться к завершению разговора в точке отправки, но это не имеет никакого эффекта. Разве неправильно завершать разговоры на принимающей стороне, используя WITH CLEANUP? Или есть другая проблема?

Этот пост на techtarget , похоже, указывает на ошибку, и выполнение задания по очистке остатков - единственное решение ...

UPDATE: Ниже Павел указал, что мне следует избегать паттерна Fire & Forget, и я добавил активированный SP в очередь инициатора, чтобы завершить любые разговоры. Однако sys.conversation_endpoints ПОЛНОСТЬЮ заполняется, на этот раз сообщениями CD / CLOSED. Вот структура моих очередей

Send_SP:

DECLARE @h UNIQUEIDENTIFIER 
BEGIN DIALOG CONVERSATION @h 
FROM SERVICE 'InitiatorQueue' TO SERVICE 'TargetQueue' 
ON CONTRACT 'MyContract' WITH ENCRYPTION = OFF; 
SEND ON CONVERSATION @h MESSAGE TYPE 'MyMessage' (@msg)

Receive_SP (активированный SP в TargetQueue)

DECLARE @type SYSNAME, @h UNIQUEIDENTIFIER, @msg XML;
DECLARE @target TABLE (
    [message_type_name] SYSNAME,
    [message_body] VARBINARY(MAX),
    [conversation_handle] UNIQUEIDENTIFIER
)
WHILE(1=1)
BEGIN TRANSACTION
    WAITFOR(RECEIVE TOP (1000) 
        [message_type_name],[message_body],[conversation_handle] 
        FROM TargetQueue INTO @target), TIMEOUT 2000            
    IF(@@rowcount!=0)
    BEGIN
        WHILE((SELECT count(*) FROM @target) > 0) 
        BEGIN
        SELECT TOP (1) @type = [message_type_name],
            @msg = [message_body],
            @h = [conversation_handle]  FROM @target;
        // Handle Message Here
        END CONVERSATION @h; 
        DELETE TOP (1) FROM @target;
    END
END
COMMIT TRANSACTION;

End_SP (активированный SP в InitiatorQueue)

DECLARE @type SYSNAME, @h UNIQUEIDENTIFIER, @msg XML;
DECLARE @init TABLE (
    [message_type_name] SYSNAME,
    [message_body] VARBINARY(MAX),
    [conversation_handle] UNIQUEIDENTIFIER
)
WHILE(1=1)
BEGIN TRANSACTION
    WAITFOR(RECEIVE TOP (1000) 
        [message_type_name],[message_body],[conversation_handle] 
        FROM InitiatorQueue INTO @init), TIMEOUT 2000           
    IF(@@rowcount!=0)
    BEGIN
        WHILE((SELECT count(*) FROM @init) > 0) 
        BEGIN
        SELECT TOP (1) @type = [message_type_name],
            @msg = [message_body],
            @h = [conversation_handle]  FROM @init;
        END CONVERSATION @h; 
        DELETE TOP (1) FROM @init;
    END
END
COMMIT TRANSACTION;

1 Ответ

1 голос
/ 12 августа 2010

Использование паттерна «забей и забудь» неизбежно приведет к этому и другим типам проблем. Кроме того, любые гипотетические ошибки останутся незамеченными. Есть ли какая-то причина, по которой вы не можете изменить шаблон обмена сообщениями, чтобы цель выдает END CONVERSATION (без очистки!), Как только получает сообщение, а затем инициатор вызывает END CONVERSATION (снова, без очистки) после получения сообщения об окончании разговора от цели?

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