【问题标题】:DynamoDB async access from Play Framework来自 Play Framework 的 DynamoDB 异步访问
【发布时间】:2017-04-14 06:27:47
【问题描述】:

我需要从 Play Framework 应用程序访问和写入 DynamoDB。 已经有几个关于这个话题的问题(hereherehere;但他们都至少 3 岁)。

问题的答案通常是使用包装器 (AWScala by seratch) 或专用于 Play 的库:

不过,包装器只是在底层调用 SDK 的同步版本。如果可能的话,我希望能够在新版本发布后立即更新 AWS 开发工具包,而不是依赖于首先更新使用的 Scala/Play 库。所以对我来说最好的选择是aws-scala-sdk wrapper generator by awslabs。例如,异步包装器使用 Future<PutItemResult> putItemAsync(PutItemRequest putItemRequest, AsyncHandler<PutItemRequest,PutItemResult> asyncHandler) 方法,它仍然返回 Java Future,但也可以使用 AsyncHandler 的回调来驱动 Scala Future 的响应:

val promise = scala.concurrent.Promise[PutItemResult]
dynamoDBAsync(request, new com.amazonaws.handlers.AsyncHandler[PutItemRequest, PutItemResult]() {
  override def onSuccess(request: PutItemRequest, result: PutItemResult) = promise.success(Ok)
  override def onError(exception: Exception) = promise.failure(exception)
})
promise.future

这样的代码由 aws-scala-sdk 生成器生成。这种方法与 Play 和默认的 ExecutionContext 一起使用是否安全,还是仍然会遇到阻塞线程的问题,例如调用 Java 的 Future.get()

【问题讨论】:

    标签: playframework playframework-2.0 amazon-dynamodb


    【解决方案1】:

    在使用 Play 对 DynamoDB 进行压力测试后,我相当乐观地使用 com.amazonaws.handlers.AsyncHandler

    测试设置:一个服务器实例(类型不同)和几个专用请求者实例 (m4.large)。每个请求都包含一个写入 DynamoDB 的 JSON 有效负载(大约 200 字节)。每个请求者实例启动几个处理实际请求的线程。请求在一段时间内均匀分布,每个请求者实例以交错的方式增加其线程,因此 DynamoDB 不会限制任何请求(具有 10000 个预置写入容量单位的表,根据 CloudWatch,没有任何请求受到限制)。 ulimit -n(打开文件的数量)在服务器实例上增加到 20000,否则服务器会表现得很奇怪(进程不再侦听端口 9000,但一些线程仍然能够分派请求,而其他线程则不能)以上约 3500-4000 个请求者线程。最大 Java 堆大小为 8GB。

    我的发现如下:

    • m4.large 服务器实例:低于 2500-2700 个请求/秒的响应时间平均小于 60 毫秒。写入吞吐量上限约为 3700-3800 个请求/秒。瓶颈是 CPU,负载一直在 100%。

    • m4.4xlarge服务器实例:无论请求线程有多少,响应时间不断

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 2016-12-14
      • 2017-09-10
      相关资源
      最近更新 更多