0

探索 HTTP 客户端绑定器 Feign,我发现它不支持回调结果 (DeferredResults)。那么我将如何处理创建一个可扩展的端点以并行执行许多时间密集型任务?试图避免这样的事情:

val slowComputation : Future[Array[Bytes] = ???

def endpoint = {
    Await.result(slowComputation(), Duration(1, SECONDS))
}
4

1 回答 1

1

我是否正确理解这一点:“def 端点”是一种同步阻塞方法,您无法改变这一事实,因为它是由框架决定的?

现在,这意味着您必须在那里等待计算/ IO 返回给您。这也意味着你在那里使用一个线程。

我认为您可以做到最好,以防止该端点因许多等待线程而“过载”。所以:

  • 像您一样,指定超时。
  • 想想你愿意接受多少“等待线程”。如果有很多人在等待,那么就放弃更多的请求。喜欢:
val waiting = new AtomicInteger(0)
val maxThreadsWaiting = 200  

def endpoint() ={
    try{
       val numberThreadsWaiting = waiting.incrementAndGet()
       if(numberThreadsWaiting > maxThreadsWaiting) {
           // Return 'overload' failure. Like HTTP 503
       } else{
          Await.result(slowComputation(), Duration(1, SECONDS))
       }     
    } finally { 
       waiting.decrementAndGet()
    }
}
于 2016-04-23T02:08:20.210 回答