我需要以可靠/事务方式为外部系统排队事件和任务.使用像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