MSMQ作为SQL Server插入的缓冲区

3
我正在学习 MSMQ,并已成功地将其用于从面向消费者的 ASP.NET MVC 网站排队电子邮件和短信,以由单独的客户端应用程序处理。
如果出现缺失 SQL Server 数据库的情况,比如交换驱动器或损坏的数据库部署,将非时间关键型插入排队到本地 MSMQ 队列中以提高正常运行时间是否有意义?
从理论上讲,我可以在进行数据库更改时暂停/恢复队列处理(持久性)。有人尝试过这样做吗?还是有更好的方法?

使用MSMQ作为SQL服务器的缓冲区是一种常见的实现方式。 - John Breakwell
3个回答

4
如果您希望通过本地排队实现更高的可用性,那么您应该考虑在与IIS/ASP实例共存的SQL Express实例上部署Service Broker。使用SSB而不是MSMQ的优点在于消息存储和数据存储之间具有一致性(一个一致的备份/恢复,一个一致的故障转移单元),在负载下其扩展性比MSMQ好得多,它不需要两阶段提交DTC来协调MSMQ出列和DB插入(可以使用一个本地DB事务来出列/插入),它提供待处理消息的可查询性 (SELECT .. FROM queue),与DB HA/DR解决方案(集群故障转移/镜像)集成,您还可以获得DB包含的激活,并且所有这些都可以从熟悉的T-SQL编程环境中运行。MSMQ的主要优点是支持客户端C#/.Net API。

将本地 SQL Express 加入队列无法与远程 SQL Server 保持事务一致,对吧?这需要 DTC,而这并不适用于许多高可用性解决方案。 - usr
@usr:SSB在每个端点(发送、接收)上都是事务一致的,但消息应用程序通过不同的方式实现一致性。我建议阅读http://cs.brown.edu/courses/cs227/archives/2012/papers/weaker/cidr07p15.pdf。 - Remus Rusanu

3

我曾经参与一个团队,实现了这个功能以保证数据的可靠性。我们使用 MSMQ 将插入请求转发到数据库服务器,该服务器运行自己的服务,出列请求并运行插入操作,然后确认消息(以确保传递)。它已经运行了一年多了,我们从未被要求调查为什么它不工作...看起来非常稳定。


你是如何存储这些查询的?只是简单的“INSERT INTO…”语句,然后由监听器提取吗? - Petrus Theron
我们创建了自定义消息类来存储信息。这些消息类使用保证交付技术通过MSMQ传输发送。在数据库服务器上,有一个MSMQ监听器从队列中取出它们并运行插入操作。 - Harper Shelby
请问您能解释一下“从队列中取出它们的 MSMQ 监听器”是什么意思吗? - cja

1

这很主观,因为这取决于您的应用程序及其功能。一般来说,像MSMQ这样的东西并不用于此目的,而是要在选择的数据库上设置某种高可用性集群。在大多数情况下,数据库完全崩溃的发生是罕见的,并且通常对大多数LOB应用程序造成更大的问题,而不仅仅是在DB因任何原因而停机时存储输入数据的地方。

还有需要考虑的开销。将数据插入到数据库中的操作相对较快(在更大范围内);将序列化的 something 写入队列中,并让 something 拾取它并执行该插入操作将会给你的应用程序增加大量延迟,更别提现在一切都是异步的事实了。

话虽如此,MSMQ 可以用于确保从应用程序的一端传递到另一端的内容,因此我认为在某些情况下可能会需要这种情况。但大多数情况下,您最好相信您的数据库,并使用MSMQ启用异步处理以及执行进程间和机器间通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接