Playframework 从Play框架异步访问DynamoDB

Playframework 从Play框架异步访问DynamoDB,playframework,playframework-2.0,amazon-dynamodb,Playframework,Playframework 2.0,Amazon Dynamodb,我需要从Play Framework应用程序访问和写入DynamoDB。 关于这个话题,已经有几个问题了(,和;但是,他们都至少有3岁) 这个问题的答案通常是使用包装器()或专用于播放的库: 然而,包装器只是在引擎盖下面调用SDK的同步版本。如果可能的话,我希望能够在新版本发布后尽快更新AWS SDK,而不依赖于首先要更新的使用过的Scala/Play库。所以对我来说最好的选择就是。例如,异步包装器使用Future putItemAsync(PutItemRequest PutItem

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

这个问题的答案通常是使用包装器()或专用于播放的库:

然而,包装器只是在引擎盖下面调用SDK的同步版本。如果可能的话,我希望能够在新版本发布后尽快更新AWS SDK,而不依赖于首先要更新的使用过的Scala/Play库。所以对我来说最好的选择就是。例如,异步包装器使用
Future putItemAsync(PutItemRequest PutItemRequest,AsyncHandler 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()一样的阻塞线程的问题

在花了大量时间进行压力测试后,我对在游戏中使用DynamoDB表示怀疑,我对使用
com.amazonaws.handlers.asynchHandler
相当乐观

测试设置:一个服务器实例(类型不同)和两个专用请求者实例(m4.large)。每个请求都包含一个JSON负载,该负载被写入DynamoDB(大约200字节)。每个请求者实例启动几个线程来处理实际请求。请求在一段时间内均匀分布,每个请求者实例以交错的方式提升其线程,以便DynamoDB不会阻止任何请求(表中有10000个已配置的写入容量单元,根据CloudWatch,从未阻止任何请求)。 服务器实例上的
ulimit-n
(打开的文件数)增加到20000,因为如果不这样,服务器的行为将异常(进程不再侦听端口9000,但某些线程仍然能够发送请求,而其他线程则不能)超过3500-4000个请求者线程。最大Java堆大小为8GB

我的调查结果如下:

  • m4.大型服务器实例:响应时间低于2500-2700个请求/秒