在Redis中存储缩略图

时间:2016-04-02 13:03:09

标签: amazon-s3 redis thumbnails

对于Messenger应用程序,我将最新消息存储在Redis中。

他们将被保留24小时。随着每条消息我都有一个缩略图。

将缩略图(每个2KB)与Redis中的消息一起存储是一种好方法吗?由于我在一个事务中获取消息和图像,因此可以更快地获取消息。

或者缩略图是否应存储在S3中,尽管我需要为每条消息添加额外的PUT和GET请求?

修改

每封邮件的缩略图不同。消息由文本和图像链接组成。虽然全分辨率图像存储在S3上,但Redis中保存的消息仅包含指向它的链接。

客户端是iOS应用程序。该应用程序收集Redis的所有消息。如果邮件中包含图像,则在下载完整分辨率文件之前,只应显示缩略图。

应用程序设计必须允许数千个请求/秒。

参见WhatsApp示例:

enter image description here

修改

我计算了两个选项的AWS成本。

Redis: Redis将耗资3千美元兑换1.2亿条消息。

S3:每条消息的额外PUT请求会使S3费用翻倍。每月1B消息10k美元

1 个答案:

答案 0 :(得分:4)

我们假设这是您的要求:

  • iOS应用即时消息应用;
  • 会有 1k / s 消息;
  • 如果邮件中包含可预览的信息,例如video / img,则应显示缩略图。

一些推断条件:

  • 在峰值期间可能会有 3k / s 消息;
  • 在峰值期间可能会有 3k / s 可预览的消息。

我认为你的系统的其他部分做得很好,并且不会有瓶颈。 1k / s消息意味着你需要每秒至少写1k写一次redis,这对redis来说完全没什么。然后你问你是否需要在redis中存储可预览信息的缩略图,我的快速和个人答案是

客户端方面

你要问自己的第一个问题是,在这种情况下,回复时间对客户来说真的很重要吗?预览的缺失会是一个很大的麻烦,并导致主要的用户体验下降?有没有办法忍受缓慢的响应时间,同时保持相对较高的用户体验?

与缺少视频/ img链接相比,如果用户没有看到视频/ img的预览,我相信用户不会太不开心。我同意错过img预览可能会导致一些用户体验版本降级,但为什么你会显示出一些说法"我很糟糕请怪我"?只要收到完整的缩略图,就可以显示img。

服务器方面

您应该问的第一个问题是,缓存是否提供了比上传更多的好处?此外,缓存是否会引入任何问题?

由于您可能无法很好地控制缩略图大小,推送到redis可能需要更长时间并消耗的资源超出预期。这可能会导致将文本消息写入redis时出现问题。此外,如果您将缩略图存储在redis中,则需要通过服务器要求缩略图,这是另外一个请求,并且响应很快。

建议

不要存储在redis中,只需生成缩略图并上传到S3。相信亚马逊,他们在大多数时间都很好。

但等等,我们完成了吗?绝对没有。为什么我们需要先将图像上传到我们的服务器,然后要求服务器生成缩略图上传它们?为什么我们不能在客户端进行此操作?

是的,这是另一种解决方案。压缩图片,上传缩略图和完整大小到S3,并获得它的链接,并将链接发送到服务器。然后服务器将此链接发送到另一个客户端,另一个客户端将从S3获取图像。

通过这种方式,即使在高峰期,您的服务器也不会被巨大的图像淹没。

关注

当然有很多问题:如何处理上传失败案例?如何处理恶意滥用行为?如何处理重复的图像(如贴纸)?如何将图像链接到聊天室?

我会将这些问题留给您,因为其中一些与商业逻辑有关:)

最后的话

DO使用良好的流量模拟和良好的记录来进行负载测试和基准测试,以便您知道瓶颈的位置,并且可以明智地进行优化。

永远记住:首先运行它,然后正确运行,只有在你有足够的动力和强大的理由时才能快速运行。 Premature optimization is the root of all evil,浪费时间。