合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
Instagram,分享带有字幕的照片和视频的免费社交应用。帖子可使用标签和地理标签进行组织,使其可搜索。若标记,帖子对粉丝和公众可见。用户可将配置文件设置为私人以限制对粉丝的访问。
图片
我们的数据本质是关系型,并且我们需要数据的顺序(帖子应按时间顺序出现)和即使在故障的情况下也不会丢失数据(数据持久性)。此外,我们的例子中,我们将从关系查询中受益,如根据用户 ID 获取关注者或图像。因此,基于 SQL 的数据库满足这些要求。
因此,选择关系数据库,并在该数据库存储相关数据。
图片
客户端请求上传照片,负载均衡器将请求传递给任何一个应用服务器,后者向数据库添加一个条目。向用户发送已成功存储照片的更新。若遇到错误,也会通知用户。
查看照片的过程与上述流程类似。客户端请求查看一张照片,从数据库中获取与请求匹配的合适的照片,并显示给用户。客户端还可以提供关键字来搜索特定图像。
读请求多于写请求,并将内容上传到系统中需要时间。若分离读(上传)写服务,效率会更高。 由许多服务器操作的多个服务处理相关请求。读服 务执行为用户获取所需内容的任务,而写服务有助于将内容上传到系统。
还需缓存数据来处理数百万次读取。它通过使获取过程快速来改善用户体验。我们还将选择延迟加载,这可以最大限度地减少客户端的等待时间。它允许我们在用户滚动时加载内容,从而节省带宽,并专注于加载用户当前正在查看的内容。这改善了在 Instagram 上查看或搜索特定照片或视频的延迟。
照片上的读/写操作:
图片
当用户打开他们的 Instagram 时,我们发送timeline生成的请求:
但这种方法响应***较慢***,因为每次用户打开 Instagram 时我们都会生成timeline
可通过离线生成timeline,大大减少用户感知到的延迟。如在用户打开 Instagram 前,我们定义一个服务,该服务会提前为用户获取相关数据,当该人打开 Instagram 时,它会显示timeline。这减少了显示timeline的延迟率。
推送方法中,每个用户都负责将他们发布的内容推送给关注他们的人的timeline。在之前的方法中,从每个关注者那里拉取帖子,但在当前方法中,我们将帖子推送给每个关注者。
现在只需获取推送到该特定用户的的数据来生成timeline。
基于推送的方法:
图片
混合方法 — 让我们将我们的用户分为两类:
时间轴服务从基于拉取的关注者那里拉取数据并将其添加到用户的时间轴中。基于推送的用户将他们的帖子推送到他们关注者的时间轴服务,以便时间轴服务可以将其添加到用户的时间轴中。
我们针对 userID 将用户的时间表存储在键值存储中。在请求时,我们从键值存储中获取数据并显示给用户。键是 userID,而值是时间轴内容(指向照片和视频的链接)。因为值的存储大小通常限制在几兆字节内,所以当我们接近大小限制时,我们可以将时间轴数据存储在 blob 中,并将指向 blob 的链接放在键的值中。
可向我们的 Instagram 添加一个名为故事的新功能。在故事功能中,用户可以添加一张照片,该照片仅可供他人在 24 小时内查看。我们可以通过在表中维护一个选项来实现这一点,我们可以在其中存储故事的持续时间。我们可以将其设置为 24 小时,任务计划程序删除超过 24 小时限制的条目。
Instagram 的最终设计:
图片
参考:
TOP