在AWS中的何处存储与数据库记录相关联的大量HTML内容

时间:2018-11-26 06:53:22

标签: mysql amazon-web-services amazon-s3 amazon-dynamodb

我有一个使用MySQL数据库记录来呈现页面的Web应用程序。

每条记录具有以下内容:

  • ID(主键)
  • 各种类型的附加字段(整数,varchar,long等)
  • 文本(或中文本)类型的字段,用于存储页面上显示的静态HTML块

静态HTML永远不会在联接中使用,也不是可搜索的。仅当通过主键检索整个记录时才检索它。

到目前为止,一切进展顺利。但是,随着表大小的增加,我认为将静态HTML文本存储在MySQL外部可能更有效。

MySQL数据库在AWS RDS中运行。因此,我正在考虑使用另一个AWS服务来存储文本数据。所以我目前的选择是:

  • 保留MySQL中的所有内容而不必担心表的大小(当前接近1 GB,并且增长迅速)。
  • 将S3对象用于HTML文本数据,并通过主键或存储在表中的UUID之类的东西引用它们
  • 将DynamoDB用于HTML文本数据,并使用存储在数据库中的键(或通过相同的主键)引用值

我对选项1的关注是表的大小。选项2和3的问题在于同步问题,并且在渲染页面时必须在服务器端进行额外的调用才能获取数据。我的理解是DynamoDB的数据检索速度将比S3快,但是它对每个记录都有大小限制,并且处理容量单位等时可能会变得昂贵而混乱。

任何指导都会有所帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您已经准确地确定了DynamoDB和S3之间的权衡。

我认为最简单的解决方案是使用S3。在S3和MySQL之间保持同步并不像您想象的那样困难或容易出错。我专业工作的应用程序之一使用了该策略(针对不同的用例),而且我们从未遇到与S3数据与主数据库不同步相关的操作负担。

是的,来自S3的延迟高于DynamoDB。您可以预期DynamoDB的时间少于10毫秒,而S3则需要几十毫秒(假设对象<= 400 kB,DynamoDB项的大小限制)只有几十毫秒。但是,S3不需要您提供容量,实际上,文件大小没有限制。 (从技术上讲,单个文件不能超过5TB,但在这种情况下您不太可能达到该文件。)

除非您知道需要一位数毫秒的延迟,否则应使用S3。它就是为此设计的。

S3保证在创建对象时具有很强的一致性,但在更新对象时只能保证最终的一致性。如果您对此感到担心,请确保每次正常更新时都只创建一个新对象。由于您将密钥存储在数据库中,因此您无需绑定到特定的文件名,并且每次修改html时都可以轻松生成一个新密钥。

如果使用S3构建它,并且延迟最终变得过高,则可以在S3前面放置一个缓存,或者可以尝试使用带有CloudFront的Lambda @ Edge迁移到无服务器模型,以从S3提供静态资源。