对于Messenger应用程序,我将最新消息存储在Redis中。
他们将被保留24小时。随着每条消息我都有一个缩略图。
将缩略图(每个2KB)与Redis中的消息一起存储是一种好方法吗?由于我在一个事务中获取消息和图像,因此可以更快地获取消息。
或者缩略图是否应存储在S3中,尽管我需要为每条消息添加额外的PUT和GET请求?
修改
每封邮件的缩略图不同。消息由文本和图像链接组成。虽然全分辨率图像存储在S3上,但Redis中保存的消息仅包含指向它的链接。
客户端是iOS应用程序。该应用程序收集Redis的所有消息。如果邮件中包含图像,则在下载完整分辨率文件之前,只应显示缩略图。
应用程序设计必须允许数千个请求/秒。
参见WhatsApp示例:
修改
我计算了两个选项的AWS成本。
Redis: Redis将耗资3千美元兑换1.2亿条消息。
S3:每条消息的额外PUT请求会使S3费用翻倍。每月1B消息10k美元
答案 0 :(得分:4)
我们假设这是您的要求:
一些推断条件:
我认为你的系统的其他部分做得很好,并且不会有瓶颈。 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,浪费时间。