Google cloud datastore 查找数据存储中是否存在大量密钥(最多为1m)

Google cloud datastore 查找数据存储中是否存在大量密钥(最多为1m),google-cloud-datastore,Google Cloud Datastore,我们在谷歌云数据存储中有一个100万行的表。查找大量密钥(500K-1M)的最有效方法是什么 对于上下文,一个用例可能是我们有一个大的内容数据存储(想想域中的所有网页)。此数据存储包含每个文档的预爬网内容和元数据。然而,每一份文档都会受到许多用户的喜爱。现在,当我们有一个新用户,他/她说他/她喜欢文档{a1,a2,…,an},我们想知道这些文档ak{k in 1到n}是否已经爬网。这就是我们希望执行上述查找的原因。如果有一部分文档我们还没有,我们会立即开始抓取它们。是的,最终目标是检索所有这些文

我们在谷歌云数据存储中有一个100万行的表。查找大量密钥(500K-1M)的最有效方法是什么

对于上下文,一个用例可能是我们有一个大的内容数据存储(想想域中的所有网页)。此数据存储包含每个文档的预爬网内容和元数据。然而,每一份文档都会受到许多用户的喜爱。现在,当我们有一个新用户,他/她说他/她喜欢文档
{a1,a2,…,an}
,我们想知道这些文档
ak{k in 1到n}
是否已经爬网。这就是我们希望执行上述查找的原因。如果有一部分文档我们还没有,我们会立即开始抓取它们。是的,最终目标是检索所有这些文档内容并使用它们构建用户配置文件

我目前的想法是发出一系列查找请求。每个查找请求最多可包含1K个密钥[1]。然而,要获得1M组中每个密钥的存在性,我仍然需要发出1000个请求

另一种方法是使用定制的中间层提供快速查找(例如,可以使用bloom filter或类似工具),以节省多个请求之间的时间。假设我们从不删除密钥,每次插入密钥时,我们都会通过中间层添加它。bloom过滤器跟踪我们拥有的密钥(具有可容忍的误报率)。因为这是一个自定义层,所以我们可以提供无限制的微服务。假设我们可以回应一个请求,要求提供一百万把钥匙。然而,这无疑增加了我们的设计/实现复杂性

有没有更有效的方法?也许是更好的设计?谢谢


[1]

我建议用更具可扩展性(成本更低)的方法来解决这个问题

在您提到的用例中,您可以一次处理一个文档,每个文档在数据存储中都有一个对应的实体。 网页URL唯一标识页面,因此您可以使用它为相应实体生成唯一的键/标识符。通过单键查找(强一致性),您可以确定实体是否存在,即是否已考虑对网页进行爬网。如果没有,则创建一个新实体并为其启动爬网作业

实体键的长度可能是一个问题,请参阅。为了避免这种情况,您可以将URL存储为网页实体的属性。然后,您必须通过url属性查询实体,以确定是否已考虑对该网页进行爬网。这只是,意味着从创建文档实体(及其爬网作业启动)到它出现在查询结果中可能需要一段时间。没什么大不了的,它可以通过爬行作业中的一些逻辑来解决,以防止和/或删除文档重复

我会将“like”信息作为将文档映射到用户的小实体,与文档和用户实体分开,以防止在单个实体中维护可能非常长的列表的缺点,请参见和

当用户喜欢具有特定URL的网页时,您只需检查匹配的文档实体是否存在:

  • 如果它确实创建了类似的映射实体
  • 如果没有,并且您使用了上述唯一密钥标识符:
    • 创建文档实体并启动其爬网作业
    • 创建类似的映射实体
  • 否则:
    • 启动爬网作业,该作业将创建负责重复数据消除的文档实体
    • 稍后,当(唯一)文档实体可用时,启动延迟作业以创建映射实体。可能是用链子把爬行的工作拴起来了。可能需要一些重试逻辑
检查一个用户是否喜欢某个特定的文档就变成了对一个这样的映射实体的简单查询(需要注意,因为它最终也是一致的)


有了这样的方案,您就不必再进行大规模的查找,您一次只需进行一次—这没关系,一个用户一次只喜欢一个文档,这比提供一个大的喜欢文档列表更自然。

我建议用一种更具伸缩性(且成本更低)的方法来解决这个问题

在您提到的用例中,您可以一次处理一个文档,每个文档在数据存储中都有一个对应的实体。 网页URL唯一标识页面,因此您可以使用它为相应实体生成唯一的键/标识符。通过单键查找(强一致性),您可以确定实体是否存在,即是否已考虑对网页进行爬网。如果没有,则创建一个新实体并为其启动爬网作业

实体键的长度可能是一个问题,请参阅。为了避免这种情况,您可以将URL存储为网页实体的属性。然后,您必须通过url属性查询实体,以确定是否已考虑对该网页进行爬网。这只是,意味着从创建文档实体(及其爬网作业启动)到它出现在查询结果中可能需要一段时间。没什么大不了的,它可以通过爬行作业中的一些逻辑来解决,以防止和/或删除文档重复

我会将“like”信息作为将文档映射到用户的小实体,与文档和用户实体分开,以防止在单个实体中维护可能非常长的列表的缺点,请参见和

当用户喜欢具有特定URL的网页时,您只需检查匹配的文档实体是否存在:

  • 如果它确实创建了类似的映射实体
  • 如果没有,并且您使用了上述唯一密钥标识符:
    • 创建文档实体并启动它