[英]Spring Batch Partitioning with retry and rate limit
我正在使用 Spring Batch 通过 HTTP API 从我们的客户站点获取数据。 进度包含两个主要步骤:
Paritioner
分配给一个分区步骤。客户网站可能是“脆弱的” 。 他们可能有速率限制,或者他们的网站可能在一些繁重的请求后没有响应。
我正在使用spring-retry
重新运行由于速率限制或服务器错误而失败的请求。 例如:
// the partition step's item reader
@StepScope
public class CustomItemReader extends ItemReader<Object> {
private List<Object> items;
@Override
public Object read() {
if (Objects.isNull(items)) {
this.items = ImportService.getPage(pageId);
}
if (Objects.nonNull(items) && !items.isEmpty()) {
return items.remove(0);
}
return null;
}
}
// config retry for fetching function
public class ImportService {
@Retryable(
value = RetryableException.class,
maxAttempts = 3,
backoff = @Backoff(
delay = 1000
)
)
public static List<Object> getPage(String pageId) throws RetryableException {
return ...;
}
}
重试配置包含Backoff
策略,该策略具有增量延迟 (1000 ms)。 我使用这个Retryable
来处理重试和速率限制。
Retryable
会反复等待并重新执行 function,它一直持有线程。 当事情变得更大时,实例可能会崩溃。Retryable
with Backoff
并不是控制速率的理想方式。 尽管我为每个客户站点配置core_pool_size
, core_pool_size=1
对某些人来说还不够。sleep
来实现。scrapy
,它具有非常酷的重试和速率限制功能。 使用RetryMiddleware ,它会将失败的页面排入队列并在设置中有一个RETRY_LIMIT
。 使用AutoThrottle ,它可以根据服务器上的负载自动限制速度。 有什么方法可以在 Spring Batch 中实现这些功能? 或者我必须用scrapy
重写我的项目?非常感谢你!
Spring Batch 不提供此类功能。 但是您可以在该步骤期间在适当的地方使用任何速率限制库(即读取数据之前/之后,处理或写入数据之前/之后等)。
这应该会有所帮助: Spring 批量写入器限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.