如何快速安全地调用rest api 600,000次并插入600,000 * n
How to call rest api 600,000 times quickly and safely and insert 600,000 * n
我的待办事项
rest api 获取请求约 600,000 次
--- 600,000 = 2009~现在 * condition1 * condition2 * condition3 * condition4
process json data = 600,000 * n (make {flat json}... from {[json array]})
在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 等中捕获由于任何原因失败的请求,稍后重试。
在使其成为多线程时,您可以使用线程池并向它们提交个人请求以使其更快,前提是您有足够的内核来执行这些额外的线程。
我的待办事项
rest api 获取请求约 600,000 次 --- 600,000 = 2009~现在 * condition1 * condition2 * condition3 * condition4
process json data = 600,000 * n (make {flat json}... from {[json array]})
在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 等中捕获由于任何原因失败的请求,稍后重试。
在使其成为多线程时,您可以使用线程池并向它们提交个人请求以使其更快,前提是您有足够的内核来执行这些额外的线程。