gpt4 book ai didi

java - 响应式(Reactive)网络爬虫对同一域的并发请求有限

转载 作者:行者123 更新时间:2023-11-30 05:22:00 25 4
gpt4 key购买 nike

我正在开发一个开源项目 web crawling project 。我注意到该应用程序偶尔会向其爬行的网站发送大量请求(我收到429 Too Many Requests)。因此,我想将并发请求数限制为 1,同一域的请求之间延迟一秒。

我想出了这段代码来做到这一点:

Flux.generate(downloaderQueueConsumer)
.doFirst(this::initializeProcessing)
.flatMap(this::evaluateDocumentLocation)
.groupBy(this::parseDocumentDomain, 100000)
.flatMap(documentSourceItem1 -> documentSourceItem1
.delayElements(Duration.ofSeconds(1))
.doOnNext(this::incrementProcessedCount)
.flatMap(this::downloadDocument)
.flatMap(this::archiveDocument)
.doOnNext(this::incrementArchivedCount)
)
.doFinally(this::finishProcessing)
.subscribe();

我对这段代码的问题是它没有将域的并行请求计数限制为 1。有办法实现吗?

最佳答案

如果您想这样做,您可能需要在 Flux 外部维护某种状态 - 没有明显的方法可以在 Flux 本身内存储和更改此类可变数据。

话虽这么说,这不是我推荐的速率限制方法 - 我做了类似以下的事情,这是一个更好、更强大的解决方案:

  • 将 429 状态代码映射到“速率限制”异常(您可能需要自己定义此异常类型)
  • 引入reactor-extra,然后使用Retry使用带抖动的指数退避(或您喜欢的任何退避策略)。

这将使您能够更好地控制特定的重试策略,并可能使您的代码更具可读性。

关于java - 响应式(Reactive)网络爬虫对同一域的并发请求有限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59409754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com