我正在计划一个即将开发的社交网络应用程序。我已经有使用许多 AWS 服务的经验,这些服务包括:SES、SimpleDB、DynamoDB、CloudFront 和 S3。我愿意随时学习更多。
基本上在应用程序中,您有状态更新。每个用户都有一个帐户,可以上传自己的状态更新,例如,评论状态更新等。用户可以查看最近“x”小时内最喜欢的状态更新,还可以在整个数据库中搜索状态更新通过搜索用户名或搜索状态更新关键字——例如用户在创建时指定的 YouTube 标签。
这是我当前的架构:
- 使用 DynamoDB 在 S3 上托管每个带有属性的状态更新键,并使用范围查询来比较喜欢、时间戳、
- 使用 SimpleDB 托管 S3 的所有帐户密钥和其他密钥以及要查询的属性
- 使用 Amazon S3 托管所有账户数据和状态更新数据
- 使用 CloudFront 在全球分发 S3 存储桶内容
因此,当用户想要查看最后一天最喜欢的状态更新时,它会查询 DynamoDB 以在 24 小时的时间戳内找到最喜欢的状态更新。如果用户想要搜索状态更新的标签,DynamoDB 将拥有标签属性并对其进行查询。但是 DynamoDB 可以查询字符串吗?查看字符串是否匹配?我不这么认为......我不想扫描 DynamoDB 并根据它们的格式单独匹配键。命名约定可以包括里面的属性,例如状态更新的键名可以是:
最大:UploadedQuote:ijfi93nSNDiI:numberOfLikes="3499"
或类似的东西
这是因为扫描限制为 10 MB,我认为对于平均活跃用户群可能无法解决,我不想发送多个请求并使应用程序膨胀。如果用户想要查看某人的帐户,它会在 SimpleDB 上找到密钥并将其加载到 S3 上。
显然,特定用户的状态更新必须组织到他们的帐户对象中,但我需要一个单独的对象来保存所有状态更新(DynamoDB)——否则我怎样才能让用户在整个数据库中搜索状态更新?
我认为最难的部分是按喜欢和标签排序,我需要以某种方式拥有像 DynamoDB 这样的数据库,快速且可扩展,但能够像 SimpleDB 一样查询。不过,我只想使用 AWS。我知道这是可能的,因为我知道一个名为 PanoPerfect 的应用程序使用 AWS,它们具有与我计划类似的功能。我想知道他们的架构是如何运行的。Instagram 也是如此!
显然,在 SimpleDB 上托管所有状态更新更有意义,因为您可以正确查询它们,我什至不确定 DynamoDB 上的查询是否按我的计划工作,但如果我托管每一个状态更新,它将溢出 SimpleDB 并使其膨胀。不过 DynamoDB 可能很昂贵。
有更好的架构吗?我应该使用 CloudSearch 而不是这个 DynamoDB 进程进行搜索吗?CloudSearch 在 iOS 上可用吗?EC2呢?这是如何运作的?在这个规划阶段,我很不确定如何使用 AWS 构建我的应用程序。
谢谢您的帮助!