6

我有一个概念,我想通过 DynamoDB 的冗余和 Elasticache 的速度在 AWS 中运行会话获得人们的意见。

  1. PHP 将会话存储在 DynamoDB 中。
  2. 当会话写入 DynamoDB 时,值也会写入 Elasticache(可能以 JSON 格式存储在一个密钥对中,以便快速进行整个检索。
  3. PHP 然后查询 Elasticache 的会话。
  4. 如果 PHP 在 Elasticache 中找不到会话,它会检查 DynamoDB - 因此为节点故障、集群故障和站点故障提供备份。如果找到会话,则将其写回 Elasticache(如果可能),如果没有,则在 DynamoDB 中创建一个新会话。

好,坏,凌乱,复杂??

4

2 回答 2

5

不,这还不错/很复杂——这是 memcache 作为持久数据存储的直写式缓存的一种非常标准的用法。但是,从 AWS 每月计费的角度来看,这是一个非常昂贵的解决方案。

您是否只使用 DynamoDB 进行过基准测试?这是一个由 SSD 支持的键值存储,应该足够快。不过,我说“应该”,因为当我尝试对它做同样的事情时,我遇到了可怕的延迟问题。我们最终完全转向了 ElasticCache 解决方案,只是忍受了节点故障的可能性。但这是针对一个现有的应用程序,它被匆忙地硬塞到 AWS 上,并且使用了大得离谱的会话对象。我没有时间重新审视这个想法。

于 2013-01-23T05:38:55.817 回答
4

为了补充 jamieb 所说的内容,这里有一些链接:

如果您要使用 ElastiCache,我建议您使用他们的自动发现功能,这样您只需担心一个 memcache 端点,而不管实际有多少缓存节点。

如果您要使用 DynamoDB,您应该使用AWS SDK for PHP提供的DynamoDB 会话处理程序。这是一个关于如何使用会话处理程序的简单代码示例:

<?php

// Load SDK via Composer autoloader
require 'vendor/autoload.php';

// Instantiate the SDK with your config
$aws = Aws\Common\Aws::factory('/path/to/config/file');

// Instantiate the DynamoDB client and register the session handler
$db = $aws->get('dynamodb');
$db->registerSessionHandler(array(
    'table_name' => 'sessions',
    'hash_key'   => 'id',
));

// Use PHP sessions like normal
session_start();
$_SESSION['foo'] = 'bar';
session_commit();
于 2013-01-23T21:58:51.510 回答