使用Vertx HttpClient和RxJava进行背压

时间:2016-11-30 10:36:40

标签: rx-java vert.x rx-java2

我在创建“背压系统”时遇到了问题。我使用的是Vertx HttpClient和RxJava。 我需要向外部服务做6000请求,并且为了避免在waitingForQueue中填满,由于这个外部服务无法像我发送的那样快速处理,我在请求/响应之间放了一个延迟。

由于这个过程是批量处理的,所以如果需要一分钟就不用担心。

这是我的代码

return from(subGroups)
        .flatMap(subGroup -> getProductIdsForSubGroup(subGroup))
        .delay(50, TimeUnit.MILLISECONDS)

这个方法是从Observable间隔调用的,该间隔每24小时运行一次,通过这个子组列表(6000)

但是在检查了我的日志之后,我看不到我的请求50毫秒之间的延迟

这里有3个日志

{"@timestamp":"2016-11-30T10:32:48.973+00:00","event":"started","requestHost":"localhost","requestMethod":"GET","requestUri":"/v3/comercial?category=T15EB&clientId=ERROR_NOT_SUPPLIED","requestHash":189630582,"level":"INFO","thread_name":"vert.x-eventloop-thread-5"}
{"@timestamp":"2016-11-30T10:32:48.978+00:00","event":"started","requestHost":"localhost","requestMethod":"GET","requestUri":"/v3/commercial?category=T15EE&clientId=ERROR_NOT_SUPPLIED","requestHash":1296199359,"level":"INFO","thread_name":"vert.x-eventloop-thread-5"}
{"@timestamp":"2016-11-30T10:32:48.981+00:00","event":"started","requestHost":"localhost","requestMethod":"GET","requestUri":"/v3/commercial?category=T15EG&clientId=ERROR_NOT_SUPPLIED","requestHash":228306365,"level":"INFO","thread_name":"vert.x-eventloop-thread-5"}

知道我需要做些什么来实现这个目标吗?

问候。

我最终使用concatMap如果你有更好的解决方案,请告诉我

return from(subGroups)
        .concatMap(subGroup -> Observable.just(subGroup).delay(50, TimeUnit.MILLISECONDS))
        .flatMap(subGroup -> getProductIdsForSubGroup(subGroup))

1 个答案:

答案 0 :(得分:1)

请注意delay只会延迟发射,所以它基本上浪费了时间。

如果您可以通过最多10个同时请求/连接来查询远程系统,则可以使用2参数flatMap

return from(subGroups)
    .flatMap(subGroup -> getProductIdsForSubGroup(subGroup), 10);