获取 DynamoDB / AWS 生态系统中的热门帖子
Posted
技术标签:
【中文标题】获取 DynamoDB / AWS 生态系统中的热门帖子【英文标题】:Get trending posts in DynamoDB / AWS Ecosystem 【发布时间】:2020-02-12 12:13:20 【问题描述】:我正在尝试构建自己的社交网络/论坛应用程序,人们可以在其中添加和喜欢彼此的帖子。我使用 DynamoDB 作为带有单个表的数据库。对于帖子点赞功能,我将 Lambda 函数 与 DynamoDB-Streams 结合使用,后者聚合了 like 属性。 目前我正在研究这些用户帖子的排名机制。有了这个,我想确保我的用户可以在那个时间点在论坛中列出有趣的帖子。为此,我阅读了 reddit 如何在 page 上处理其排名算法。我还 @ 987654322@ *** 上的问题靠近我,没有一个好的答案 imo。 我的问题是,如何在 AWS 生态系统的帮助下解决这个问题(甚至可能仅使用 DynamoDB 和 Lambda 函数? ) 编辑: 我的数据库架构如下所示:
Partitionkey Sortkey likes ...
---------- -------- ------
forum#soccer 01.08.19 13:15
forum#baseball 22.08.19 20:11
post#soccer#Do you think FC Barcelona wins? 05.08.19 10:20 203
post#soccer#Which club is your favorite ? 05.08.19 10:20 2
like#Which club is your favorite ? John Wick
like#Which club is your favorite ? Walter White
...
每次插入以 like# 开头的项目时,都会触发一个 lambda 函数并更新 like 列上的帖子条目。我的目标是查询当前最时尚的帖子。这应该可以通过可用的信息(如创建时间和帖子的数量)来实现。目前我的查询只是返回最新的帖子
【问题讨论】:
您的实际问题是什么,我如何组织我的 DDB 表以便我可以查询它以获得最多喜欢的帖子?如果是这样,请描述您当前的桌子设计。 你的表结构会很有帮助,从描述中很难理解。 @dmigo 我编辑了我的问题。现在清楚了吗?感谢您的帮助 @AshamanKingpin 我编辑了我的问题:) 您希望查询返回什么?按点赞数排序的帖子列表?帖子列表会一直存在吗?最后一小时?最后一天? 【参考方案1】:我将提供一个可能的解决方案,仅考虑 DynamoDB 和 Lambda(可能还有 AWS SQS)。如果不合适,我们可能会考虑使用其他解决方案,如 Amazon ElastiCache。
算法:
您的 DynamoBD 表将包含一个分区键 (NOTE 1) 名为 trending#posts
的项目,只有 trending
(由您决定)并将键排序为日期或类型帖子(或您想要排序的任何内容。您可能想要分析一段时间内的趋势 - 使用排序键作为日期 - 或按帖子类型过滤趋势)。或者,如果您不想要过滤器,您可以只使用一个值。
帖子中的每个点赞都会触发一个 Lambda,该 Lambda 将处理热门帖子(注意 2)。
触发后,Lambda 将收到点赞的帖子并执行:
阅读保存在您的表格中的所有 N 个热门帖子。
读取这些帖子的点赞数和发布时间。
在当前 N 个帖子中执行趋势得分,如果喜欢的帖子与那些不同,也在新帖子中。
再次对帖子进行排序,并将得分最高的 N 保存在您的表格中。
注意 1:您不需要随着时间的推移获得确切的分数,只需要排名即可。我的意思是,如果您保存上午 9 点的趋势,则不需要下午 1 点的正确趋势,只需要第 1、第 2 的位置……您只需要出现新的喜欢时的新分数。
注意 2:我说 “也许还有 AWS SQS” 因为用户可能会同时喜欢帖子,而 Lambda 会同时执行,并且可能会出现一致性问题。使用 AWS SQS,每个点赞都会将事件推送到触发 Lambda 的 SQS。这样 Lambda 将不会同时执行。
【讨论】:
注意 2 听起来像是最佳实践方法,解耦并允许未来的一些其他功能。以上是关于获取 DynamoDB / AWS 生态系统中的热门帖子的主要内容,如果未能解决你的问题,请参考以下文章
aws 胶水 pyspark 删除数组中的结构,但保留数据并保存到 dynamodb
AWS SDK JavaScript v3 / 如何在 dynamoDB 扫描命令中使用 ExpressionAttributeNames?
AWS Lambda 测试不从 DynamoDB 表返回数据