gpt4 book ai didi

scala - 选择正确的 ExecutionContext

转载 作者:行者123 更新时间:2023-12-05 07:04:12 28 4
gpt4 key购买 nike

我一直在开发一个中小型 Web 应用程序,大约有 10 个端点。它应该可以同时处理数百个并发请求。

由于我公司的政策,我必须为我的 Controller 使用 javax.ws.rs,所以每个 Controller 方法都会返回一个 javax.ws.rs.core.Response

每个controller都依赖一个Service,负责去数据库(DynamoDB,使用v2非阻塞java dynamoDb sdk),通过http(使用org.asynhttpclient)从其他微服务获取数据,创建case表示我的响应的类,因此我的 Controller 可以将其序列化并将其作为 javax.ws.rs.core.Response 中的正文返回。

我的应用程序中的每个组件都是异步和非阻塞的,我的服务返回 Future[Either[MyAppError, CaseClassRepresentingMyResponse]]。然后,在 Controller 中,最后我等待 future 的结果,并创建 javax.ws.rs.core.Response:

所以我的 Controller 看起来像这样:

class BarController(barService: BarService)(implicit ec: ExecutionContext) {

def getFoo(userId: BigInt, fooId: String): Response = withMetrics(Bar.ServiceName, Bar.GetFoo) {
val fooResponse = for {
_ <- EitherT(validateUserIdAndFooId(userId, fooId))
foo <- EitherT(barServiceService.getFoo(userId, fooId))
} yield foo

Await.result(fooResponse.value, 10 seconds) match {
case Success(Right(r)) => buildOkResponse(r)
case Success(Left(NotFound)) => HttpResponses.notFound
(.... a bunch of other cases ......)
}
}
}

(我正在使用猫 EitherT 来处理 Future[Either[E, A]]。)

我的应用程序中的每个组件都接收一个隐式 ExecutionContext,并返回一个 Future[Either[E,A]]

现在,我刚刚完成所有的编码和测试,我需要在我的配置中提供一个合适的 ExecutionContext

ExecutionContext.global 就足够了吗?考虑到我的代码从不阻塞(因为我使用的是 DynamoDb 非阻塞 sdk 和 org.asynchttpclient),还是我应该创建一个不同的 ExecutionContext?也许来自 FixedThreadPool?还是 ForkJoinPool?

最佳答案

关于scala - 选择正确的 ExecutionContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62997039/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com