我们正在使用DynamoDB来同步ELB下多台EC2机器之间的会话。
我们注意到这种方法减慢了很多脚本。
具体来说,我制作了一个js,它在服务器上调用10次3个不同的PHP脚本。
1)第一个只是一个echo timestamp();往返时间约为50毫秒。 2)第二个是一个php脚本,通过mysqli连接到RDS MySQL并花费相同的时间(大约50-60ms)。 3)第三个脚本使用官方AWS文档中描述的DynamoDB会话保持方法,大约需要150毫秒(慢3倍!!)。
我每晚都在清理垃圾(正如文档所说),DynamoDB指标似乎没问题(附在下面)。
我使用的代码是:
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Session\SessionHandler;
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
ini_set('session.gc_probability', 0);
require 'aws.phar';
$dynamoDb = DynamoDbClient::factory(array(
'key' => 'XXXXXX',
'secret' => 'YYYYYY',
'region' => 'eu-west-1'
));
$sessionHandler = SessionHandler::factory(array(
'dynamodb_client' => $dynamoDb,
'table_name' => 'sessions',
'session_lifetime' => 259200,
'consistent_read' => true,
'locking_strategy' => null,
'automatic_gc' => 0,
'gc_batch_size' => 25,
'max_lock_wait_time' => 15,
'min_lock_retry_microtime' => 5000,
'max_lock_retry_microtime' => 50000,
));
$sessionHandler->register();
session_start();
我做错了什么,或者在整个时间内检索会话是否正常?
感谢。
答案 0 :(得分:0)
在AWS论坛中复制AWS工程师的信件:https://forums.aws.amazon.com/thread.jspa?messageID=597493
这里有几件事需要检查:
- 您是否在与DynamoDB表位于同一区域的EC2上运行应用程序?
- 您是否启用了OPcode缓存,以确保SDK使用的类不需要从磁盘加载并在每次 脚本运行?
醇>使用Apache等Web服务器并连接到DynamoDB会话 将要求在每个请求上建立新的SSL连接。 这是因为PHP(当前)不允许您重用cURL 请求之间的连接句柄。一些数据库驱动程序允许 对于请求之间的持久连接,可以解释 性能差异。
如果您跟进AWS论坛主题,AWS工程师应该能够帮助您解决问题。如果要保持打开状态,也会监视此线程。