我选择DynamoDB作为活动供稿/事件数据的后端,但在决定使用最佳数据结构方面遇到了一些麻烦。
首先,我应该解释每个用户的活动ID存储在Redis排序集(用于个人配置文件活动)和Redis列表中的个人活动流,这意味着我在DymaoDB中的任何活动表只需要一个哈希键并且不需要范围,本地或全局索引,因为它们基本上是在Redis中编制索引的。
我们这样做是为了通过操作Redis中的ID列表和集合来有效地聚合Feed和配置文件活动数据。
无论如何......我们最初的计划是每个月创建一个DynamoDB表,将活动数据存储在那里......然后随着年龄的增长拨打旧表的预配置吞吐量,保持最新数据的快速和可用保持旧数据的成本。
虽然这种技术对于活动流本身非常有效,但在查看用户配置文件(以及他们自己的历史活动)时它不起作用。因为,以类似于Facebook时间线的方式,用户能够查看我们返回的所有内容他们的出生,并能够在他们的个人资料中添加自定义生活事件。这个要求意味着在过去80年左右的每个月都有一张表格,因此,我们还需要其他的东西。
目前,我们正在考虑将活动表拆分为活动类型。 e.g:
activities_comments
actvities_likes
actiities_uploads
activities_posts
......等等。
我们需要大约20个表来涵盖我们当前的所有活动类型。使用这种方法可以让我们有选择地为最常见的活动提供吞吐量,对于我们而言,保持单个活动表具有庞大且昂贵的预配置吞吐量似乎更为可取。
在redis中,我们只需为每个活动ID添加一个表后缀,以便我们知道活动元数据存储在哪个表中,然后我们就可以按如下方式查询数据:
对于活动流:
对于用户个人资料
数据聚合将在离线状态下完成,我们将分析在给定时间段内发生的类似活动的redis列表/排序集,然后使用聚合元数据创建新活动,将其添加到dynamoDB,添加新数据Redis在正确的位置进行活动,最后从Redis列表/集合中删除所有旧的相关活动。
e.g。
以上实际上要复杂得多,并且考虑到我们开发的最受欢迎的帖子和活动权重...但它给你一个粗略的想法。
所以,既然我已经描述了我们目前正在考虑的解决方案,我想知道的是:
我知道这是一个模糊的问题,需要阅读很多,但任何意见或评论都会受到高度赞赏。
注意:为了完整起见,我应该说明活动ID是在写入Redis中的用户关注者活动流时被推出的。虽然我们并不反对在阅读时改变扇形,但是有人应该让我们相信它在答案中的好处。
答案 0 :(得分:1)
您可以在活动表上启用DynamoDB Streams,并为attach Lambda functions启用Redis结构中的活动。建议使用时间序列表来管理热/冷数据的配置吞吐量成本。但是,存在一些实际限制,例如256 tables的每个帐户的每个帐户限制可能会限制您在DynamoDB中保留所有数据的能力。相同的Lambda函数可以使用滑动窗口维护活动计数缓存,您可以使用该窗口将许多小活动聚合为聚合活动。
答案 1 :(得分:1)
在DynamoDB上构建活动源和新闻源需要大量额外的基础架构,因为您传播数据的方式(写入时出扇),这通常会导致大量的配置剧和高成本。
我写了一篇文章,描述了在DynamoDB here上运行新闻源的挑战。
免责声明:我是首席技术官,也是Stream的共同创始人之一