如何快速安全地调用rest api 600,000次并插入600,000 * n

How to call rest api 600,000 times quickly and safely and insert 600,000 * n

我的待办事项

  1. rest api 获取请求约 600,000 次 --- 600,000 = 2009~现在 * condition1 * condition2 * condition3 * condition4

  2. process json data = 600,000 * n (make {flat json}... from {[json array]})

  3. 在mariaDB中插入数据(600,000 * n)

我使用 4 个嵌套循环(条件数)创建了一个请求 url,并在打开的连接上接收到响应数据。

但是,某些数据导致读取超时 (con.setReadTimeout(1000 * 60) -- 1min)。

我的方法一天没有收到所有数据。

并且插入甚至都没有尝试。

我想我应该一次多线程处理待办事项列表,对吗?

请告知如何快速安全地调用 rest api 并处理数据和插入。

在我的代码下方。

    ExecutorService executor = Executors.newWorkStealingPool();
    List<Callable<String>> callables = null;
     for (String url : urlList) { //600,000 count
                callables.add(getRestapiData(url)); //call rest api 
            }

            try {
                executor.invokeAll(callables)
                        .stream()
                        .map(future -> {
                            try {
                                return future.get();
                            } catch (Exception e) {
                                throw new IllegalStateException(e);
                            }
                        }).map(DataSummaryServiceLogic::getSettedKamisApi1DataList). //process ->return (600,000 * list.size) list
flatMap(Collection::stream). 
forEach(api1 -> provider.insertInitKamisApi1(api1)); //insertData
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

@Jays 根据您分享的有限信息,您需要进行适当的异常处理。如果 1 个请求超时 600k ,那么它不应该导致其他请求失败。您可以在 logs/reprocess table 等中捕获由于任何原因失败的请求,稍后重试。

在使其成为多线程时,您可以使用线程池并向它们提交个人请求以使其更快,前提是您有足够的内核来执行这些额外的线程。