我正在筹划一个我即将开发的社交网络应用程序。我已经有使用许多AWS服务的经验,这些服务是:SES,SimpleDB,DynamoDB,CloudFront和S3。我随时愿意学习更多。我应该如何为我的应用程序构建Amazon Web Services?
基本上在应用程序中,你有状态更新。每个用户都有一个帐户,可以上传他们自己的状态更新,比如评论状态更新等。用户可以查看最近'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构建我的应用程序。
感谢您的帮助!
你的困惑的根源问题,我认为,是你在一个传统的SQL模式,而不是一个key-value存储(NoSQL的)的思维像DynamoDB。 [这个答案](http://stackoverflow.com/questions/9131191/how-do-you-query-dynamodb)应该提供一个很好的起点。 – jamieb
@jamieb我不认为我很困惑,我很少使用SQL。我只是没有阅读DynamoDB可以执行的查询类型,所以我不确定。我会检查一下。谢谢 – MCKapur