假设我有10个网址,我希望为每个网址发出HTTP请求.
我可以创建一个可观察的URL,然后.flatMap()是每个URL 的请求,然后.subscribe是结果.但这会立即产生所有要求.
有没有办法对固定数量的请求数量施加限制,以免使服务器过载
我猜这应该有点容易实现,但我遇到了麻烦(从概念上讲,我猜)找出如何解决它.
我所拥有的是一个返回JSON对象数组的API.我需要逐步浏览这些对象,并为每个对象进行另一个AJAX调用.问题是处理每个AJAX调用的系统一次只能处理两个活动调用(因为它是一个CPU密集型任务,可以挂钩到桌面应用程序中).
我想知道如何使用RxJS(使用版本5或4)来实现这一目标?
编辑:此外,是否可以同时运行一系列步骤.即
Downloading File: 1
Processing File: 1
Converting File: 1
Uploading File: 1
Downloading File: 2
Processing File: 2
Converting File: 2
Uploading File: 2
Downloading File: 3
Processing File: 3
Converting File: 3
Uploading File: 3
我尝试过这样的事情:
Rx.Observable.fromPromise(start())
.concatMap(arr => Rx.Observable.from(arr))
.concatMap(x => downloadFile(x))
.concatMap((entry) => processFile(entry))
.concatMap((entry) => convertFile(entry))
.concatMap((entry) => UploadFile(entry))
.subscribe(
data => console.log('data', new Date().getTime(), data),
error => logger.warn('err', error),
complete => logger.info('complete')
);
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不起作用.例如,downloadFile不等待processFile,convertFile和uploadFile全部完成,而是下一个将在前一个完成后再次运行.
TL;DR - 我正在寻找一种方法来控制 HTTP 请求并发连接到 REST API 的数量,同时我使用 RxJS。
我的 Node.js 应用程序将向第三方提供商发出几千次 REST API 调用。但是,我知道如果我一次发出所有这些请求,服务可能会因为 DDoS 攻击而关闭或拒绝我的请求。所以,我想在任何给定时间设置最大并发连接数。我曾经通过利用Throat Package使用 Promises 实现并发控制,但我还没有找到类似的方法来实现这一点。
我尝试merge按照这篇文章中的建议使用with 1 进行并发如何限制 flatMap 的并发?,但所有请求都是一次性发送的。
这是我的代码:
var Rx = require('rx'),
rp = require('request-promise');
var array = ['https://httpbin.org/ip', 'https://httpbin.org/user-agent',
'https://httpbin.org/delay/3',
'https://httpbin.org/delay/3',
'https://httpbin.org/delay/3'
];
var source = Rx.Observable.fromArray(array).map(httpGet).merge(1);
function httpGet(url) {
return rp.get(url);
}
var results = [];
var subscription = source.subscribe(
function (x) {
console.log('=====', x, '======');
},
function (err) {
console.log('Error: ' + err); …Run Code Online (Sandbox Code Playgroud) 我有一个我想要同时下载的页面的URL列表HttpClient.URL列表可能很大(100或更多!)
我目前有这个代码:
var urls = new List<string>
{
@"http:\\www.amazon.com",
@"http:\\www.bing.com",
@"http:\\www.facebook.com",
@"http:\\www.twitter.com",
@"http:\\www.google.com"
};
var client = new HttpClient();
var contents = urls
.ToObservable()
.SelectMany(uri => client.GetStringAsync(new Uri(uri, UriKind.Absolute)));
contents.Subscribe(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)
问题是:由于使用的原因SelectMany,几乎同时创建了大量的任务.似乎如果URL列表足够大,很多任务会给出超时(我得到"任务被取消"例外).
所以,我认为应该有一种方法,可能使用某种调度程序,来限制并发任务的数量,在给定时间不允许超过5或6.
通过这种方式,我可以获得并发下载而无需启动太多可能会失速的任务,就像他们现在所做的那样.
如何做到这一点,我不会因为大量的超时任务而饱和?
十分感谢.