需要DynamoDB/Redis活动流帮助

 Jump_jiedB0_666 发布于 2023-02-11 11:12

我选择DynamoDB作为活动源/事件数据的后端,但在决定使用最佳数据结构时遇到了一些麻烦.

首先,我应该解释每个用户的活动ID存储在Redis排序集(用于个人配置文件活动)和Redis列表中的个人活动流,这意味着我在DymaoDB中的任何活动表只需要一个哈希键而没有需要范围,本地或全局索引,因为它们基本上是在Redis中编制索引的.

我们这样做是为了通过操作Redis中的ID列表和集合来有效地聚合Feed和配置文件活动数据.

无论如何......我们最初的计划是每个月创建一个DynamoDB表,将活动数据存储在那里......然后随着年龄的增长拨下旧表的预配吞吐量,保持最新数据的快速和可用,同时保持成本旧数据.

虽然这种技术对于活动流本身非常有效,但在查看用户配置文件(以及他们自己的历史活动)时它不起作用.因为,以类似于Facebook时间线的方式,用户能够查看我们回到他们出生时的所有内容并能够将自定义生活事件添加到他们的个人资料中.这个要求意味着在过去80年左右的每个月都有一张表,因此,我们还需要其他东西.

目前,我们正在考虑将活动表拆分为活动类型.例如:

activities_comments
actvities_likes
actiities_uploads
activities_posts

... 等等.

我们需要大约20个表来涵盖我们当前的所有活动类型.使用此方法将允许我们有选择地为最常发生的活动提供吞吐量,对于我们而言,保持单个活动表具有巨大且昂贵的预配置吞吐量似乎更可取.

在redis中,我们只需为每个活动ID添加一个表后缀,以便我们知道活动元数据存储在哪个表中,然后我们就可以按如下方式查询数据:

对于活动流:

存储在Redis列表中的每个用户流的activityID(包含聚合后所有关注者的活动数据)

保持列表截断为500项以保持redis内存需求下降

使用Redis lrange进行简单查询,以获取最近的活动20个活动

使用DynamoDB batchGetitem从各种表中提取ID ....当用户向下滚动它们的流时,冲洗并重复.

对于用户配置文件

存储在Redis中的聚合activitID为每个用户分类,时间戳为分数

使用Redis zrangebyscore从
排序集中获取活动ID的特定月份或时间范围(即用户可以根据需要快速提取2012年7月的活动历史记录)

再次使用batchGetItem从DynamoDB检索数据

数据聚合将在离线状态下完成,我们将分析在给定时间段内发生的类似活动的redis列表/排序集,然后使用聚合元数据创建新活动,将其添加到dynamoDB,将新活动添加到Redis在正确的地方,最后从Redis列表/集中删除所有旧的相关活动.

例如

在一周内发现260张相同的照片.

我们使用反映这一点的元数据构建一个SINGLE新活动,其中包含旧的activityID列表(我们需要检索它们)

从redis列表/集中删除260个activityID,并替换为单个新的activityID.

以上实际上要复杂得多,并考虑到我们开发的最流行的帖子和活动权重...但它给你一个粗略的想法.

所以,既然我已经描述了我们目前正在考虑的解决方案,我想知道的是:

    这听起来像是一个好/快/灵活/可扩展的解决方案吗?

    是否有任何替代数据结构可能比我描述的更好?

    我们可能没有想到的上述场景是否有任何明显的问题?

我知道这是一个模糊的问题,有很多东西需要阅读,但任何意见或评论都会非常感激.

注意: 为了完整起见,我应该说明活动ID是在写入Redis中的用户关注者活动流时被推出的.虽然我们并不反对在阅读时改用扇形,但是有人应该让我们相信它在答案中的好处.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有