【问题标题】:SQL Queue Service Broker ApplicationSQL 队列服务代理应用程序
【发布时间】:2014-02-19 02:02:15
【问题描述】:
我正在设计一个将从 SQL 队列中读取消息的应用程序。这是一个要求。我必须使用他们的队列。问题是如何读取他们的队列。我想像使用 MSMQ 一样使用它,但看起来不可能。我需要一次按 FIFO 顺序读取一条消息。要一次阅读一个,我必须让每条消息都成为对话,但它们不一定是 FIFO 顺序。我可以使用一个永无止境的对话来维持秩序,但我相信我必须阅读队列中的所有内容。不只是一条消息。有没有人构建了一个应用程序来执行我需要的方式?这是不可能的吗?还有其他建议吗?
提前致谢。
【问题讨论】:
标签:
sql
sql-server-2008
message-queue
service-broker
【解决方案1】:
从 SQL 队列中读取消息。这是一个要求......我想像使用 MSMQ 一样使用它,但它看起来不可能。我需要按 FIFO 顺序一次读取一条消息。
我的建议是不要尝试在圆孔中安装方钉。如果使用 Service Broker 是一项要求,那么不要试图适应您的编程模型。对自己进行一些关于 Service Broker 编程的教育,并尝试设计一些利用 SSB 优势的东西。在继续前进之前阅读这些链接:
去吧,我等着……
我希望到现在为止,有一种方法可以满足您最初的要求:SSB 提供 Exactly Once In Order 交付在对话中,因此您可以仅实现 FIFO strong> 通过在单个对话中发送所有消息。 SSB 还允许您使用RECEIVE TOP(1) ... FROM ... 将出队限制为仅一条消息。将这两者结合起来,您就可以得到您想要的。
但这不是 SSB 应用程序的设计方式。实际上没有理由将出队限制为单个消息,您应该将批处理出列并循环处理批处理。保持一个事务,结果与一次一个出队没有区别。接下来,FIFO 要求只有在对话中才有意义,只要您有多个发送者,FIFO 就不能存在,作为一个基本概念(当多个发送者同时发送消息时,'First' 是什么意思?'First' 击中目标排队,在随机网络轮盘赌中?)。通过按消息到达的顺序出队,您可能会产生 FIFO 的错觉,而实际上 SSB 正是这样做的。一旦您考虑并发处理,天真的“全局 FIFO”概念就会崩溃。加入回滚和重试作为调味品。