接收时 Service Broker 队列回滚

Service Broker queue rollback on receive

基于 here

使用

Service Broker provides automatic poison message detection. Automatic poison message detection sets the queue status to OFF if a transaction that receives messages from the queue rolls back five times. This feature provides a safeguard against catastrophic failures that an application cannot detect programmatically.

我有一个 windows 服务应用程序,它轮询 SB 队列并将它们发送到 Web 服务端点。因为,我应该处理任何 "server goes-off" 问题─将消息返回到队列,所以我包括“队列项目接收”和“队列项目发送" 方法到同一个事务中。在第一个异常 (HttpRequestException) 上,我开始 ping 服务器以获得预定义的超时,然后 continue/close 程序。

然而,回滚五次是个问题,我知道无论 5 次连续回滚之间的时间间隔如何,它总是会全局增加回滚计数,因此队列最终将被禁用。我说得对吗?队列是否有归零回滚计数的超时?

如果是这种情况,是否最好从事务中排除 "queue item sending" 方法? 如果我这样做,我应该遵循这样的方法,即在异常情况下将消息保存在另一个资源(table、文件)中以便稍后发送,或其他替代方案..

如何 using tables as queues 来保持我的交易统一并从 SB 的回滚问题中解脱出来?它会像SB一样可靠吗?

AFAIK,无论时间间隔如何,POISON_MESSAGE_HANDLING = ON 队列上同一消息连续回滚 5 次都会禁用队列。

您是否考虑过简单地关闭队列的有害消息处理?然后,您的应用程序就有责任区分真正的有害消息(永远无法成功处理的消息)与外部服务依赖性问题。在第一种情况下,您可以在别处记录问题消息并提交而不是回滚。

还有其他模式可以使用,例如重新排队消息和提交,但这在很大程度上取决于是否必须按顺序处理消息。