You could try to use RxJS bufferCount
and concatMap
operators along with forkJoin()
.
From bufferCount
docs:
Collect emitted values until provided number is fulfilled, emit as
array.
So it collects n
number of notifications and emit it as an array. We could then pass the array through forkJoin()
for n
number of parallel requests.
Try the following
I assume this.urls
is a collection of HTTP requests similar to
urls = [
this.http.get('url1'),
this.http.get('url2'),
this.http.get('url3'),
...
];
Then the requests triggering code would look like
bufferedRequests() {
from(this.urls).pipe(
bufferCount(6), // <-- adjust number of parallel requests here
concatMap(buffer => forkJoin(buffer))
).subscribe(
res => console.log(res),
err => console.log(err),
() => console.log('complete')
);
}
According to this comment by a Chromium engineer, actual solution to the max. connections to host/domain limit would be to use WebSockets or Domain sharding. But since you mention it isn’t possible in your environment, you could use the buffered request workaround.
However I wouldn’t try to buffer to the max limit. If you were to send more requests to the same domain than the max allowed, you could see that the additional requests would actually throttle behind till the above requests are finished. So say if were to buffer to the max allowed limit, and your application sends an additional request to the same domain from somewhere else on which the app workflow depends on, the entire app could throttle.
So it’s better to either use WebSockets or Domain sharding. And if neither is possible it’s better to buffer the requests to a number of requests less than* the max allowed limit.
* Obviously, if you’re 100% percent sure no other requests will be triggered to the same domain during the buffering procedure, then you could buffer to max. allowed limit.