2010-06-30 3 views
0

Я пишу веб-сайт, который использует несколько веб-сервисов с ограничениями дроссельной заслонки. То есть Amazon - 1 запрос в секунду, другой - 5000/день другой - x/минута.какой шаблон дизайна использовать для нескольких дросселируемых запросов api?

Когда пользователь что-то делает, мне нужно вызвать один или несколько запросов к вышеуказанным службам и вернуть результаты (в браузер), когда они доступны.

Решение должно быть гибким, поэтому я могу легко добавлять/удалять службы.

Я подумал о системе quister of FIFO, но некоторые более поздние запросы могут действительно иметь право на обработку до более ранних.

Я прошу шаблон дизайна, но любые подходящие предложения технологий очень приветствуются, особенно .NET.

Спасибо!

ответ

0

Спасибо за ваш комментарий. В основном я не хочу отклонять запросы, я хочу поставить их в очередь и отобразить обратно пользователю, когда они были обработаны. Как система заказов.

запрос

0:00:01 Amazon приходит -> следующий слот доступен в 2 секунды (0:00:03)

0:00:02 х приходит запрос -> следующий слот для данной услуги 5 секунд (0:00:07)

0:00:03 запрос Amazon приходит -> следующий слот доступен в 2 секунды (0:00:05)

мне нужна система очереди, которая будет сначала вытащите 2 запроса амазонки. Думаю, мой вопрос заключается в том, создавать ли отдельные очереди для каждой службы и любой общей технологии (например, Service Broker), которая хорошо подходит для дросселирования, если не я создам собственную систему дросселирования/обслуживания, и именно поэтому я искал общие шаблоны проектирования (то есть производитель/потребитель или что-то еще), поскольку это не FIFO из-за вышеприведенного примера.

До сих пор он выглядел как очередь FIFO для каждой службы, с ее собственным дросселированием, выглядит как способ двигаться вперед.

0

Я не уверен, что полностью понял, где вы видите проблему. От

некоторые более поздние запросы могут фактически иметь право на обработку до более ранних.

Я полагаю, что вас беспокоят запросы буферизации, которые не могут быть удовлетворены сейчас, но могут быть обработаны в ближайшее время.

Вы получили запрос, такие как

{ Amazon, X } 

и из (скажем) X дросселирования не может satisify этот запрос прямо сейчас.

Моим первым вопросом было бы, являются ли запросы независимыми, то есть я могу обработать запрос Amazon немедленно и поставить очередь на запрос X? Если это так, то простая очередь FIFO для каждого сервисного сервиса наверняка выполнит эту работу. Вероятно, вам нужно будет иметь максимальный размер очереди (учитывая, что время ожидания запросов HTTP, вы не можете ждать несколько часов).

Если вы имеете в виду отсрочку выдачи запроса Amazon до тех пор, пока не будет возможно выдавать запрос 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 

Здесь наша {Amazon, 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 

Лично я хотел бы начать с чем-то гораздо проще: Если запрос не может быть удовлетворяется прямо сейчас, потому что любой один лимит обслуживания достигнут, просто отклоните запрос.

Смежные вопросы