我正在计划开发一个社交网络应用程序。我已经有很多使用AWS服务的经验,它们是:SES, SimpleDB, DynamoDB, CloudFront和S3。我愿意随时学习更多的知识。
基本上在应用中,你有状态更新。每个用户都有一个帐户,可以上传自己的状态更新,喜欢,评论状态更新等。用户可以查看最近"x"小时内最喜欢的状态更新,也可以通过搜索用户名或搜索状态更新关键字来搜索整个数据库的状态更新,例如用户在创建时指定的YouTube标签。
下面是我当前的schema:
- 使用DynamoDB托管每个状态更新键 S3上的属性和使用范围查询比较喜欢,时间戳,
- 使用SimpleDB托管S3的所有帐户密钥和其他具有查询属性的密钥
- 使用Amazon S3托管所有帐户数据和状态更新数据
- 使用CloudFront在全球范围内分发S3桶内容
因此,当用户想要查看最近一天最喜欢的状态更新时,它会查询DynamoDB以查找时间戳为24小时内最喜欢的状态更新。如果用户希望搜索以查找状态更新的标记,DynamoDB将具有tags属性并对此进行查询。但是DynamoDB可以查询字符串吗?看看字符串是否匹配?我不这么认为……我不想扫描DynamoDB并根据它们的格式单独匹配键。命名约定可以包含属性,例如状态更新的键名可以是:
马克斯:UploadedQuote: ijfi93nSNDiI: numberOfLikes = " 3499 ">
p>或者类似的这是因为扫描限制是10 MB,我认为对于普通和活跃的用户群来说可能无法实现,我不想发送多个请求并使应用程序膨胀。如果用户想要查看某人的帐户,它会在SimpleDB上找到键并将其加载到S3上。
显然,特定用户的状态更新必须组织到他们的帐户对象中,但是我需要一个单独的对象来保存所有状态更新(DynamoDB)——否则我怎么能让用户在整个数据库中搜索状态更新呢?
我认为最困难的部分是按喜欢和标签排序,我需要以某种方式有一个像DynamoDB这样的数据库,快速和可扩展,但能够像SimpleDB一样查询。不过,我希望仅使用AWS。我知道这是可能的,因为我知道有一个叫PanoPerfect的应用程序使用AWS,它们与我计划的功能非常相似。我想知道他们的架构是如何运行的。Instagram也是!
显然,托管SimpleDB上的所有状态更新更有意义,因为你可以正确地查询它们,我甚至不确定DynamoDB上的查询是否如我计划的那样工作,但如果我托管每一个状态更新,它将溢出SimpleDB并使其膨胀。但是DynamoDB可能很昂贵。
有更好的模式吗?我应该使用CloudSearch而不是DynamoDB过程进行搜索吗?CloudSearch在iOS上可用吗?那么EC2呢?这是怎么做到的呢?在这个规划阶段,我不确定如何使用AWS构建我的应用程序。
谢谢你的帮助!
听起来您决定使用Amazon的NoSQL数据库之一。如果它不工作,就不要使用它。
我的建议是尽可能构建最简单的东西,并专注于首先获得用户。Twitter、Facebook、Ebay和其他每一个排名前1000的网站都是从一个常规的数据库开始的,当它们流行起来时,担心扩展。
如果你真的担心扩展,看看CouchDB, Cassandra或Riak。它们具有简单的伸缩语义。(不像MongoDB或MySQL,你必须做复杂的手动分片。)
可以DynamoDB查询字符串?看看字符串是否匹配?
只能查询主索引或从索引。您可以将标记投射到二级索引中。但是你只能查询精确匹配的标签。
CloudSearch在iOS上可用吗?那么EC2呢?
是的。像所有的服务一样,它是一个web API。
这是如何工作的?
这不是Stack Overflow的问题