我需要以可靠/事务方式为外部系统排队事件和任务。使用像MSMQ或ActiveMQ这样的东西看起来非常诱人,但事务部分变得复杂(MSDTC等)。

我们可以使用数据库(SQL Server 2005 +,Oracle 9+)并实现更简单的事务支持,但排队部分变得更加丑陋。

这两条路线看起来都不那么好,并且充满了讨厌的陷阱和边缘情况。

有人可以就此事提供一些实用指导吗?

思考:E / C / A或计划任务引擎每隔一段时间醒来,看看此时是否有任何需要运行的计划任务(即下一个运行日期已经过去,但到期日期已经过去尚未到达)。

有帮助吗?

解决方案

我们的系统有60台计算机,每台计算机运行12个任务(线程),需要“获得下一份工作”。总而言之,它涉及50K“工作”。每天。对每分钟多少交易进行数学计算并实现任务时间是可变的,因此可以得到多个“pop”事件。事件在同一时间。

我们的第一个版本使用MSMQ。结论:远离。虽然它在加载和同步问题上做得很好,但它有两个问题。一个恼人的和一个交易破坏者。

恼人的:作为企业软件,MSMQ具有安全需求,只需要与客户网络管理员进行设置和对抗。

交易破坏者:然后是我们想要接受下一份工作的时间,但没有使用简单的流行音乐,而是像“获得下一个蓝色工作”这样的事情。或“获得下一个黄色工作”。做不到!

我们去了B计划:用一个SQL 2005表实现了我们自己的Q. 不能更开心

我强调每天用200K消息测试它,工作。我们可以制作“下一个”我们想要的逻辑很复杂。

catch:你需要非常小心采用下一个项目的SQL。因为你想要它快速和非锁定。我们根据一些研究使用了2个非常重要的SQL 提示。魔术是这样的:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

其他提示

我已经看到MSMQ在事务上使用并且它似乎并不特别复杂 - 一个事务SCope包装了enqueue或者将调用与数据库访问一起出列,只要队列在创建后被定义为事务性,所有这些都很好。我不认为ActiveMQ是一个消息代理,但是MSMQ是在每个端点机器上本地安装的,因此在事务上将项目放入队列不需要花哨的分布式事务。

你可能已经意识到了这一点,但是在.NET上有一些轻量级的库提供了一些关于MSMQ的很好的抽象(理论上还有其他的传输)

nServiceBus: www.nservicebus.com

公共交通: http://code.google.com/p/masstransit/

此外,Oren Eini有一个有趣的if基于实验文件系统的事务队列。这个库的好处是,与MSMQ不同,它可以作为库部署,并且不需要部署MSMQ的维护问题。

您可以在此处阅读: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

此外,SQL Server 2005使用SQL Server Service Broker确实可以相当优雅地处理排队,但是您需要在每个端点安装SQL Server,而且我不知道SSB是否穿过防火墙。

最后,如果你没有得到你正在寻找的答案,我强烈推荐nSErviceBus论坛。 Udi Dahan回答了这些问题以及他的一小部分面向消息的追随者,这是迄今为止我发现的最好的资源,可以快速,有效地回答我的队列导向问题。那个论坛在这里: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.Net 是一个开源的作业调度系统。

这就是MSMQ的目的 - 排队交易。如果这对您不起作用,请查看“Service Broker”。 SQL Server的功能 - 它是“SQL表中的队列” 'csmba'在他的回答中描述,但它是一个集成的SQL Server组件,包装精美,可供您使用。

WebSphere MQ(MQ Series)是一个选项吗?支持事务性消息传递。

您可以查看名为的Oracle功能高级排队

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top