如果目标重新启动,Service Broker消息不会被发送
在高层,这里是发生了什么事情:
- 我们有两个SQL Server 2008 R2 SP1系统(Windows NT 6.1(Build 7601:Service Pack 1)上的标准版)它们嗡嗡声很好,双向通信,没有任何错误或问题。
- 我们重启系统#2,期望任何发送给它的Service Broker消息不可用时都会在系统#1上排队,直到系统#2恢复。
- 系统#2恢复正常,没有任何错误。
- 系统#2在系统#1上排队的消息保持排队; 他们永远不会被发送。 此外,该对话中的新消息也排队等待,不会被发送。
- 在新会话中发送的消息传输得很好。
有关从未发送的消息的详细信息:
A.当系统#2closures时,队列中的消息的transmission_status显示出各种错误,表示它不能与系统#2进行通信。
B.系统#2恢复之后不久,这些消息的传输状态变为空白。 此后空白状态不会改变。
C.消息堆叠的对话处于CONVERSING / CO状态。 系统视图中没有列表示与其他正在工作的队列没有任何区别。 (如果我能find任何设置不同的标志,我会知道终止这个不好的对话,但系统不提供线索 – 除了不断增长的队列深度。
D.在系统#2上从来没有接收到这些消息,因为我的激活存储过程从来不会被这些消息调用。
E.在Profiler中(打开所有Broker跟踪types),一个良好的对话显示这些事情被logging:
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认为对话还是不错的,但系统#2已经完全忘记了。 系统#1似乎从来没有解决这个问题。 如果我们随后重启系统#1,那么一切都恢复正常,所有消息都按预期stream动。
我已经考虑到这些消息实际上已经发送了,但是确认并没有回到系统#1。 但是我没有看到任何支持确认队列的证据。
我们检查了双方的许多典型问题:
代理双方都启用。 2.所有队列都打开,并启用所有适当的事件(入队,接收)。 队列没有中毒。 没有我们所知道的权限问题。 4.我们并没有使用“忘却遗忘”。 来自“简明英汉词典”我们正在重复谈话,因为不同的人推荐做 (实际上,会话重用是这里的问题!)6.我们正在捕获SQLexception,按照指示使用事务等。7. ssbdiagnose不返回任何错误。
当一个SQL Server主机重新启动时,我们期望任何排队的消息最终会被发送,但它们不是。 这里发生了什么??
我知道这是一个相当古老的话题,但是我之前已经和以前的情况完全相同,在我的情况下,networkingconfiguration是罪魁祸首。
由于某种原因,发起者已经从一个IP地址发送了消息,但是另一个IP已经被打开以接受传入的回复(并且这个第二个IP已经在目标的路由中被指定)。
我偶然发现了这个,真的。 当我试图结束目标端的会话时,它没有closures,但EndDialog消息出现在sys.transmission_queue
,状态为:
连接尝试失败,出现错误:“10060(连接尝试失败,因为连接的一方在一段时间后没有正确响应,或build立的连接失败,因为连接的主机未能响应)。
我不知道为什么目标重启已经引发了故障,但是当networking工程师已经解决了这个问题,我改变了目标的路线,一切都从一开始就飞到目的地。