Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制MSMQ消息/设置消息优先级_C#_.net_Msmq - Fatal编程技术网

C# 限制MSMQ消息/设置消息优先级

C# 限制MSMQ消息/设置消息优先级,c#,.net,msmq,C#,.net,Msmq,我不知道如何最好地描述这个,或最好的标题,所以请容忍我 我使用MSMQ对大量命令进行排队,这些命令将向各种网站和API发出HTTP请求。为了避免重击这些服务(并保持在某些预定义的请求限制内),我需要确保命中同一域的任务仅在上次请求经过最短时间后执行 以前,我使用数据库对任务进行排队,因此可以执行查询来实现这一点,但随着任务数量的增加(表上死锁太多),我们很快就超过了该解决方案 有人对我们可以采取什么方法有什么建议吗?我曾考虑过,在找到一个可以执行的项目之前,不要将项目从队列中移除,但我意识到,没

我不知道如何最好地描述这个,或最好的标题,所以请容忍我

我使用MSMQ对大量命令进行排队,这些命令将向各种网站和API发出HTTP请求。为了避免重击这些服务(并保持在某些预定义的请求限制内),我需要确保命中同一域的任务仅在上次请求经过最短时间后执行

以前,我使用数据库对任务进行排队,因此可以执行查询来实现这一点,但随着任务数量的增加(表上死锁太多),我们很快就超过了该解决方案

有人对我们可以采取什么方法有什么建议吗?我曾考虑过,在找到一个可以执行的项目之前,不要将项目从队列中移除,但我意识到,没有什么可以阻止队列中的排序,这意味着我们可以在不同的域中找到一个项目之前,从同一个域中移除数千个项目


谢谢

您“超越”了关系数据库并用MSMQ替换它?这就像是从大学到幼儿园的“推广”!4GB的大小限制、没有高可用性解决方案、有问题的可恢复性、没有消息队列查询,当您从MSMQ转向基于关系数据库的队列时,您已经遇到了所有人都声称的限制

我强烈建议您回到基于表的队列。在基于表的队列中有避免死锁的方法,特别是在DELETE的输出子句出现时(这是从基于表的队列中编写快速无死锁的出列操作的关键)


也可以使用现成的数据库队列解决方案,如。实际上,SSB将提供一顿免费午餐,其中包含许多功能,如内置节流()、按计划启用/禁用处理(通过启用/禁用激活)、重试、基于数据库镜像或群集的高可用性,或者。

Erm,我完全不同意Remus Rusanu的回答

MSMQ在任何方面都不是数据库表的一个阶梯,在许多方面都可以是一个阶梯,如果需要,您需要手动构建基于表的解决方案

这么说来,对于您的需求来说,数据库表似乎是最合适的

MSMQ有助于你不拥有的应用之间的交流 如果您不需要立即的结果,并且需要可靠的交付 (即,您可以在与数据库断开连接时使用MSMQ,而要使用表方法,则需要访问数据库。)
MSMQ可以实现负载平衡

好吧,这很有趣-我们根本没有扔掉我们的DB解决方案,只是存在持续的死锁问题,所以我们决定调查MSMQ的优缺点!我将看一看ServiceBroker.SSB是一种后天获得的品味;)但是用户表,摆脱死锁实际上是可行的,我已经做到了。我在生产系统中以每秒几百次的速度在低端硬件上排队/出列web调用,几个月来(在队列处理中)没有一次死锁。这不是小事,需要很好地理解死锁是如何发生的,以及如何避免死锁。我花了几周时间才解决了所有问题,我有了一些意想不到的惊喜。但是,毫无疑问,控制和定制打败了MSMQ。是的,现在我正在研究它的细节——不太好看。我已经尝试最小化我们的死锁,在行和各种类型上使用升级锁,但老实说,我的数据库知识目前并没有减少死锁,尽管我已经阅读了很多。您认为值得尝试解决我们现有的系统(它具有我们需要的功能…)而不出现死锁,或者切换到像ServiceBroker这样的东西吗?谢谢你的建议!修复现有系统。如果您不知道,您可以寻求专家建议来解决死锁问题(这并不丢脸,我们都有不同的优势)。如前所述,基于表的解决方案可以在许多级别上超过MSMQ。由于您实际上不发送任何远程消息,所以您只使用MSMQ作为队列数据结构,并且它不会死锁,因为它是完全不灵活的。您的表会死锁,因为与MSMQ相比,它允许您做更多的事情,并且您可能会匆忙添加许多功能。