1.重写AbstractRichFunction中的open()方法,在处理数据前调用limiter.acquire(1);
private GuavaFlinkConnectorRateLimiter limiter;
@Override
public void open(Configuration parameters) throws Exception {
limiter = new GuavaFlinkConnectorRateLimiter();
limiter.setRate(3000);//表示task限流3000rec/s,不是subTask
limiter.open(getRuntimeContext());
}
@Override
public void processElement(JSONObject value, Context ctx, Collector<Object> out) throws Exception{
limiter.acquire(1);
.........................
2.GuavaFlinkConnectorRateLimiter限流原理
private RateLimiter rateLimiter;
public void open(RuntimeContext runtimeContext) {
this.runtimeContext = runtimeContext;
localRateBytesPerSecond =
globalRateBytesPerSecond / runtimeContext.getNumberOfParallelSubtasks();
this.rateLimiter = RateLimiter.create(localRateBytesPerSecond);
}
调用limiter.open(getRuntimeContext())的源码,实际内部是RateLimiter,根据并行度算出subTask中RateLimiter的permitsPerSecond。