事务排队/出队

时间:2020-03-06 15:03:48  来源:igfitidea点击:

我需要以可靠/事务方式将事件和任务排在外部系统的队列中。使用MSMQ或者ActiveMQ之类的东西看起来很诱人,但是事务部分变得复杂(MSDTC等)。

我们可以使用数据库(SQL Server 2005 +,Oracle 9+)并获得更轻松的事务支持,但是排队部分变得更加难看。

两条路线似乎都不是那么好,并且充满了令人讨厌的陷阱和边缘情况。

有人可以在这件事上提供一些实用的指导吗?

想一想:E / C / A或者计划任务引擎经常唤醒,以查看此时是否需要运行任何计划任务(即,下一个运行日期已过去,但到期日期尚未结束)到达)。

解决方案

Quartz.Net是一个开放源代码的工作计划系统。

是否可以选择WebSphere MQ(MQ系列)?支持事务消息传递。

我已经看到MSMQ在事务中使用,并且事务SCope包裹入队或者出队调用以及数据库访问似乎并不特别复杂,只要队列在创建后就被定义为事务性,那么一切都很好。我认为ActiveMQ是一个消息代理,但事实并非如此,但是MSMQ是本地安装在每台终结点计算机上的,因此以事务方式将项目放入队列中不需要花哨的分布式事务。

我们可能已经意识到了这一点,但是在.NET上,有一些轻量级库通过MSMQ提供了一些不错的抽象(理论上也包括其他传输方式)

nServiceBus:www.nservicebus.com

大众运输:http://code.google.com/p/masstransit/

而且,Oren Eini具有有趣的,基于实验文件系统的事务性队列。该库的好处是,与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/

我们的系统有60台计算机,每台计算机运行12个任务(线程),这些任务需要"获得下一份工作"。总而言之,每天需要5万个"工作"。计算每分钟有多少笔交易,并意识到任务时间是可变的,因此有可能在同一时间获得多个"弹出"事件。

我们使用MSMQ获得了第一个版本。结论:远离。尽管它确实可以很好地解决负载和同步问题,但它有两个问题。一个烦人和一个破坏交易的人。

烦人:作为企业软件,MSMQ具有安全需求,这使安装和与客户网络管理员进行斗争成为一回事。

破坏交易的人:那时我们想接受下一份工作,而不是使用简单的弹出菜单,而是"获取下一个蓝色工作"或者"获取下一个黄色工作"之类的东西。做不到!

我们去了计划B:用一个SQL 2005表实现我们自己的Q。不能更快乐

我强调每天使用200,000条消息进行测试,可以正常工作。我们可以根据需要使"下一个"逻辑变得复杂。

难处:我们需要非常小心采用下一项的SQL。由于我们希望它是快速和非锁定的。根据一些研究,我们使用了2个非常重要的SQL提示。魔术是这样的:

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

这就是MSMQ用于事务排队的目的。如果这对我们不起作用,请查看SQL Server的" Service Broker"功能及其" csmba"在其答案中描述的" SQL表中的队列",但这是一个集成的SQL Server组件,包装精美,暴露给我们使用。

我们可以查看名为Advanced Queuing的Oracle功能。