在Springboot中从阵列发送并发HTTP请求

时间:2019-01-08 07:01:02

标签: spring-boot

我有一个需要发送到端点的对象数组。我目前正在遍历数组,并一一发送请求。问题是我现在有35,000个以上的请求,并且需要用响应来更新数据库。以我对springboot的有限了解,我不知道我可以使用一次发送35,000个请求的任何方法(而不是一个接一个地循环。

使用的最佳方法是仍然使用循环但利用异步调用,还是有一种方法可用于一次发送35,000个HTTP请求?..我只需要一个指针,因为我不知道线程如何处理之所以使用,是因为这已经是一个数组,并且每个元素都需要发送。

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,一次什么都不要35,000,这是一个坏主意。

但是,如果您查看Java ExecutorService,则可以使用任务填充队列,然后每个任务都将由线程池中的线程执行。线程完成后,服务会从队列中提取另一个请求并进行处理。因此,您只需提供一个执行Web请求的Runnable,创建一个足够大小的线程池(基本上通过实验确定大小,以提供最佳吞吐量),然后让线程在任务队列中紧缩。

您将需要一个足够大的队列来吸收所有任务,或者可以查看类似NotifyingBlockingThreadPoolExecutor的事物。这样一来,您就可以对队列进行处理并在队列已满时进行阻塞,直到完成所有任务为止。

附录:

我对Spring Boot的了解还不够多,无法评论“批处理作业”是否可以完成您想要的工作。

但是,请注意,除了为ExecutorService创建35,000个单独条目之外,您实际上还可以发送一个子集。例如3,500个条目,每个代表10个项目,或350个条目,每个代表100个项目。这样做的目的是要充分利用重用HTTP连接带来的任何潜在收益,而不要重复利用,因此减少了每个请求的负担。如果要比建立35,000个便宜得多,则可以建立350个连接。