【问题标题】:How to choose in which ExecutorService the play ws is executed?如何选择playws在哪个ExecutorService中执行?
【发布时间】:2018-02-25 05:02:40
【问题描述】:

1)
我想在一个隔离的线程池中执行特定的 Play WS。因为我将在后台执行大量 HTTP 调用,并且我不希望它使我的主执行程序服务过载。

注意:我在这里还发现了一个我不明白的信息:https://groups.google.com/forum/#!topic/play-framework/ibDf2vL3sT0 它解释说 PlayWs 已经拥有它自己的线程池。在 Play 2.6 中仍然正确吗?在阅读播放文档时我不明白这样的事情(请参阅:https://www.playframework.com/documentation/2.5.x/ThreadPools#Using-the-default-thread-pool

我创建了自己的上下文:

call-to-db-context {
  fork-join-executor {
    parallelism-factor = 1
    parallelism-max = 24
  }
}

但是我不知道如何指定ws请求使用这个上下文。

ws.url("http://127.0.0.1:8080/b")
  .get() // How to specify executorContext here ?

2)
此外,这个 call-to-db-context 必须具有低优先级,因为它是后台任务。我希望 Akka 处理用户请求具有更高的优先级,并且我的默认 executorContext 也是。最好的方法是什么?

【问题讨论】:

    标签: scala playframework threadpool


    【解决方案1】:

    在早期游戏中它更容易,您可以自己配置客户端(只要 WS 是 ning 之上的包装器)。

    在 2.6 中看起来有点复杂。在成熟的产品中,当某些东西不容易更改时,您很可能不需要更改它。

    所以,我认为您不需要为 WS 方法指定线程池。对于后处理可能是,如果它很长。但是播放客户端是异步的,这意味着它在等待响应时不会阻塞线程。如果您使用不可靠的网络发出请求,请使用超时。

    请参阅here 了解更多关于播放客户端的信息

    不确定是否了解您对优先级的要求。你知道akka部署配置吗?如果没有,你需要阅读here 因此,您可以为您的演员指定线程池。为演员和 ws 后处​​理(处理来自 DB 的数据?)提供不同的调度程序,您将分离这些功能。如果 ws-calls 后处理繁重,请限制 call-to-db-context 调度程序的线程数量

    评论后更新

    在您的情况下,许多 ws 调用(如果您认为它们的数量可能会影响性能)需要在两个地方进行限制:限制开始的调用数量,限制并发后处理的数量。你需要明白。为 ws 本身设置特定的 dispatcher 不会有任何限制:只要它是异步的,它就可以启动 1000 个只有一个线程的请求。

    所以,我想说你可以将你的 ws 调用包装到 actor 中。 Actor 将处理消息以启动请求,并进行后处理,例如

    receive: Receive = {
        …
        case Get(url) =>
            ws.url(url).get().onComplete {
                case Success(response) => self ! GetSuccess(response)
                case Failure(exception) => self ! GetFailure(exception) 
            }
        case GetSuccess(response) => …..
        case GetFailure(exception) => ……
    }
    

    您可以使用循环池(设置数量的工作人员)将该参与者部署在特定调度程序上。此解决方案不限制请求的开始(因此您可以获得很长的响应队列)。您可以添加成为禁用接受 Get,而没有收到 GetSuccess 或 GetFailure(因此工作人员需要在开始下一步之前完全处理请求)。

    【讨论】:

    • 我已经从 play 中阅读了这些文档。这对我没有帮助。我的问题是我有一些异步任务要执行以响应请求(包括一些 ws 调用)。另一方面,我在后台有很多 ws 调用(音量取决于小时)。所以我不希望后台 ws 调用缓慢的请求响应。所以我需要将这些调用隔离在不同的线程池中,并可能给这个线程池一个低优先级,不是吗?
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多