我正在编写一个网站,该网站使用具有限制限制的多个Web服务。即亚马逊是每秒1个请求,另一个是5000 /天另一个是x /分钟。
当用户执行某些操作时,我需要触发对上述服务的一个或多个请求,并在可用时将结果返回给浏览器。
解决方案需要灵活,以便我可以轻松添加/删除服务。
我想到了一个FIFO排队系统,但是之前的一些请求实际上可能有资格在之前的请求之前进行处理。
我要求设计模式,但是非常欢迎任何合适的技术建议,特别是.NET。
谢谢!
答案 0 :(得分:0)
我不确定我是否完全理解你在哪里看到这个问题。来自
以后的某些请求实际上可能有资格在之前的请求之前进行处理。
我推断您关注的是缓冲请求,这些请求现在无法满足,但很快就可以解决。
您收到了
等请求 { Amazon, X }
由于(比方说)X限制现在无法满足该要求。
我的第一个问题是,请求是否独立,我可以立即处理Amazon请求并排队X请求吗?如果是这样,那么每个servive的简单FIFO队列肯定会完成这项工作。您可能需要具有最大队列大小(假设HTTP请求超时,您不能等待数小时)。
如果你考虑推迟发布亚马逊请求,直到可以发出X请求,那么事情会变得更复杂。我认为你实际上有一个会议安排问题。当Amazon和X都是免费的时,您需要找到一个插槽。因此,您可以拥有某种队列列表,每个队列用于在服务的该时间单位中满足请求。
Amazon(3 per sec)
09:05:31 - request A, B, C
09:05:32 - request D, E, F
09:05:33 - request G - - <=== slots available
--- <=== times and slots available
X (2 per min)
09:05 - request M, N
09:06 - request O <=== slot available
我们{亚马逊,X}在09:06有一个插槽
Amazon(3 per sec)
09:05:31 - request A, B, C
09:05:32 - request D, E, F
09:05:33 - request G - - <=== slots available
--- <=== times and slots available
09:06:01 - request P
X (2 per min)
09:05 - request M, N
09:06 - request O, P
就个人而言,我会从更简单的事情开始:如果由于达到任何一个服务限制而无法立即满足请求,请拒绝该请求。
答案 1 :(得分:0)
感谢您的评论。基本上我不想拒绝请求,我想将它们排队并在处理完成后显示给用户。有点像订购系统。
0:00:01亚马逊请求进来 - &gt;下一个可用时段是2秒(0:00:03)
0:00:02 x请求进来 - &gt;可用于此服务的下一个插槽是5秒(0:00:07)
0:00:03亚马逊请求进来 - &gt;下一个可用时段是2秒(0:00:05)
我需要一个队列系统,首先将2个亚马逊请求拉出来。我想我的问题在于是否为每个服务创建单独的队列以及任何非常适合限制的常用技术(即Service Broker),如果不是,我最终会创建自己的限制/排队系统,这就是为什么我正在寻找常见的设计模式(即生产者/消费者或其他东西),因为它不是FIFO,因为上面的例子。
到目前为止,它看起来像每个服务的FIFO队列,它有自己的限制,看起来像是前进的方式。