I'm not sure that I've completely understood where you see the problem. From
some later requests may actually be eligible for processing before earlier ones.
I infer that you're concerned about buffering requests that cannot be satisified now but may be worked on shortly.
You received a request such as
{ Amazon, X }
and due to (say) X throttling can't satisify that request right now.
My first question would be, are the requests independent, that is can I process the Amazon request immediately and queue the X request? If so, then a simple FIFO queue for each servive will surely do the job. You probably will need to have a maximum size of queue (given that HTTP requests timeout, you can't wait for hours).
If you have in mind deferring issuing the Amazon request until it's possible to issue the X request then things get more complicated. I think you have in effect a meeting scheduling problem. You need to find a slot when both Amazon and X are free. So you could have some kind of List of Queues, each queue is for requests to be satisified in that time unit for a service.
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
Here our { Amazon, X } has a slot available at 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
Personally, I'd start with something much simpler: If the request cannot be satisified right now because any one service limit is reached, just reject the request.