Sql server ServiceBroker对话:结束还是不结束™;

Sql server ServiceBroker对话:结束还是不结束™;,sql-server,service-broker,stability,Sql Server,Service Broker,Stability,专家时间(等待@RemusRusanu和mates^^) 上下文 我构建了一个ServiceBroker,主要基于SQLTeam的blog示例(),以模拟同一SQLServer实例上两个数据库之间的ETL行为。在经历了几个小时与代理、对话、禁用队列、中毒消息、激活问题等的技巧后,我终于成功了 问题 为了让它更适合生产,我只需要处理以下主题: 消息队列清空时,未从sys.conversation_终结点清除已关闭的状态对话:SQLTeam的示例未在启动器端或接收方端提供任何结束对话,因此添加了类似

专家时间(等待@RemusRusanu和mates^^)

上下文

我构建了一个ServiceBroker,主要基于SQLTeam的blog示例(),以模拟同一SQLServer实例上两个数据库之间的ETL行为。在经历了几个小时与代理、对话、禁用队列、中毒消息、激活问题等的技巧后,我终于成功了

问题

为了让它更适合生产,我只需要处理以下主题:

  • 消息队列清空时,未从sys.conversation_终结点清除已关闭的状态对话:SQLTeam的示例未在启动器端或接收方端提供任何结束对话,因此添加了类似以下内容的注释
  • 无需结束对话,因为审核永不结束

    在激活程序中。互联网上到处都是关于不要采取放火遗忘行为的证明。我在激活过程的末尾添加了一些结束对话,得到了相同的结果。大量使用过的对话。我知道重用对话框的好处(感谢@RemusRusanu),但我希望系统尽可能稳定,即避免耗尽可用的端点套接字

    =>我到底应该做什么?结束对话/不结束?这跟这种情况有关系吗

  • 捕获的错误不会持久化到错误表中,尽管正在使用TRY/CATCH,并且INSERT语句放置在回滚之后
  • =>当出现错误时,为什么这永远不起作用

  • 在一些示例中,通信看起来像是在自定义XML消息的基础上,通过交换不同的显式消息类型(错误和对话确认)来处理的。据我所知,这意味着两个具有精确队列处理激活过程的“交叉”端点(我当前的示例中是一个)。关于这个话题有这么多的意见,我有点困惑。几分钟前,我在@RemusRusanu找到了这篇长文章,但直到现在才有机会看一看
  • =>这是否能提高我所期望的稳定性和鲁棒性

  • 最后但并非最不重要。我最近遇到了一个70 GB以上的系统卷(顺便说一句,Windows事件日志)意外完成,在2天内,与service broker的使用保持一致,这使我的虚拟机一团糟,直到我找到了根本原因(多亏了Treesize专业工具)
  • =>这是正常行为吗?有什么方法可以避免这种冗长、限制事件日志增长或配置循环周期


    非常感谢你把我带到原力的黑暗面:)

    把四个问题塞进一个问题里是不好的做法。看起来答案根本没有关系。例如,我认为#2的答案可能与外部事务仍处于活动状态且未提交有关,但我们需要更多的上下文来确定,要求澄清(以及由此产生的编辑)将与其他问题一起运行。请随意1)慢慢来,2)必要时重复上下文,3)如果你真的觉得问题有实质性的联系,请链接到问题,但不要把它变成一个“我能想到的一切都在这里”的问题。@Jeroemoster我明白了,即使我感到有点沮丧。为什么要打开4个可能相互关联的线程,而不需要拆分就可以完成这个任务?主要原因可能是清晰,好的。顺便说一句,由于我没有答案,我在我这方面做了更多的研究,从这条线索来看,我只保留最后一个关于Windows事件日志的问题,它意外地填满了死亡。有什么想法吗?ThanksIt将取决于记录的事件类型,但即使如此,您仍然可以根据大小和持续时间限制事件日志(检查其属性)。您可以完全关闭SQL Server事件日志记录,但这可能不是您想要做的。关于您的信息,我使用生命周期来结束对话,因为他们会陷入“关闭”状态并停留在那里。如果我们的应用程序与数据库断开连接的时间太长,那么它可以从头开始重新加载所有内容,所以我不需要这些消息case@tivivi,我和你有同样的错误。你找到解决办法了吗?
      ;SEND ON CONVERSATION @dlgId    
      MESSAGE TYPE [//Sync/Message] (@syncedData)
    END TRY
    BEGIN CATCH
      IF (XACT_STATE()) = -1
          ROLLBACK;
    
      INSERT INTO SyncErrors(ErrorProcedure, ErrorLine, ErrorNumber, ErrorMessage, ErrorSeverity, ErrorState, SyncedData)
      SELECT  ERROR_PROCEDURE(), ERROR_LINE(), ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE(), @syncedData
    END CATCH