现有流程响应用户输入更改表中预订记录的状态字段。
我还有另一个进程要编写,它将为具有特定状态的记录异步运行。它将读取表记录,执行一些操作(包括调用第三方 Web 服务),并更新记录的状态字段以指示处理已完成(或 In Error,带有错误计数)。
这个操作听起来很像队列。在这种情况下,使用 MSMQ 而不是 SQL 表的好处和权衡是什么,我为什么要选择一个而不是另一个?
是我们的软件在表中添加和更新记录。
这是一项将执行异步处理的新工作(Windows 服务)。这需要“永远在线”。
现有流程响应用户输入更改表中预订记录的状态字段。
我还有另一个进程要编写,它将为具有特定状态的记录异步运行。它将读取表记录,执行一些操作(包括调用第三方 Web 服务),并更新记录的状态字段以指示处理已完成(或 In Error,带有错误计数)。
这个操作听起来很像队列。在这种情况下,使用 MSMQ 而不是 SQL 表的好处和权衡是什么,我为什么要选择一个而不是另一个?
是我们的软件在表中添加和更新记录。
这是一项将执行异步处理的新工作(Windows 服务)。这需要“永远在线”。
有几个原因,在 Fog Creek 论坛上进行了讨论:http: //discuss.fogcreek.com/joelonsoftware5/default.asp ?cmd=show&ixPost=173704&ixReplies=5
主要好处是,当计算机之间存在间歇性连接时(使用本地计算机上的存储和转发机制),仍然可以使用 MSMQ。就应用程序而言,它会将消息传递给 MSMQ,即使 MSMQ 稍后可能会传递消息。
只有当您可以连接到数据库时,您才能将记录插入到表中。
当需要工作流方法时,表方法更好,并且流程将经过各个阶段,并且这些阶段需要在数据库中持久化。
如果创建预订记录的速度很低,我会让第二个过程定期检查表中是否有新预订。
除非您已经在使用 MSMQ,否则引入它只会为您提供额外的平台组件来支持。
如果数据库负载很重,或者您在两个进程读取和写入预订表的同一区域时遇到大量锁争用,那么请考虑引入 MSMQ。
使用 MSMQ,您还可以通过将队列的位置更改到另一台机器而不是 db 服务器来轻松地将工作卸载到另一台服务器。
顺便说一句,从 SQL Server 2005 开始,数据库中内置了队列。它称为 SQL 服务器服务代理。请参阅:http: //msdn.microsoft.com/en-us/library/ms345108.aspx
另见前面的讨论。
如果您有 MSMQ 专业知识,这是一个不错的选择。如果您了解数据库但不了解 MSMQ,请问自己是否想成为另一项技术的专家;您的申请是否是关键申请;当出现问题时,您更愿意调试它。
我最近一直在自己调查这个问题,所以想提一下我的发现。与您的应用程序相比,数据库的位置是决定哪个选项更快的一个重要因素。
我测试了插入插入 100 个数据库条目所花费的时间与将完全相同的数据记录到本地 MSMQ 消息中的时间。然后我取了几次执行这个测试的结果的平均值。
我发现当数据库在本地网络上时,插入一行比登录到 MSMQ 快 4 倍。
当通过良好的 Internet 连接访问数据库时,向数据库中插入一行比登录到 MSMQ 慢 6 倍。
所以:
本地数据库 - DB 更快,否则 MSMQ 更快。
如果您将服务实现为排队的 COM+ 组件并从客户端应用程序进行排队的函数调用,而不是进行原始 MSMQ 调用,这可能会更容易。最后,异步服务还是在后台使用MSMQ,但是你的代码会更清晰,更容易使用。
我自己可能会选择 MSMQ 或 ActiveMQ。我建议(假设您正在考虑使用 MSMQ,您正在使用带有 MS 技术的 windows)查看 WCF,或者如果您使用的 MS-SQL 2005+ 具有调用 .net 代码来运行您的处理的触发器。
Service Broker 是在 SQL 2005 中引入的,它的设计目的是非常快速地处理消息,因为该过程相对简单(我相信它的根源在于触发器)。如果您担心可伸缩性,他们在 SQL 2008 中发布了一个独立的处理可执行文件,以将处理与 SQL Server 分开(在标准 Service Broker 中,一切都由 SQL Server 实例控制)。
我肯定会考虑在 MSMQ 上使用 Service Broker,但这取决于您的 SQL 开发/DBA 资源及其知识。
除了 Mitch 的回答之外,还有其他一些场景: 1. 您的每条消息都有自己的到期日期来触发操作,这也可以通过 MQ 完成,但在这种情况下,我更喜欢将其存储到 db 中,因为它更可控; 2.订阅者需要过滤消息然后处理其中的一部分,这也可以通过LINQ完成,取决于过滤器的复杂程度,db方法更好,因为我可以使用linq to EF轻松进行复杂查询;3. 对于部署,我想要完全自动化的部署过程,这样 DB 对我来说是一个更好的选择。我不是手动配置的忠实粉丝。