【问题标题】:Is Google Cloud Datastore actually enforcing its 1MB entity size limit?Google Cloud Datastore 是否真的强制执行其 1MB 实体大小限制?
【发布时间】:2018-04-04 04:27:31
【问题描述】:

对于我的一项微服务,我在 MongoDB 和 Google Cloud Datastore 之间犹豫不决。微服务相当容易设置,并且在任何一个数据库中都没有其他限制是有问题的。

所有存储的文档都将包含一个精简版的网页,其中许多本身就超过 1MB。这没有我们将计算并添加到文档中的属性和结果。 因此,Datasore 对每个实体(文档)1MB 的限制是有问题的 (see here.)

另一方面,我有几个微服务,我倾向于尽可能简单地开始。 Datastore 是托管数据库的理想选择:自动扩展且 API 很棒。所以除了这个实体大小限制之外,它是我的首选。

对于 Google 数据存储区用户,他们是否真的执行实体大小限制?如果是,您是否知道有任何计划提高此限制?

【问题讨论】:

    标签: mongodb google-app-engine nosql google-cloud-datastore google-cloud-platform


    【解决方案1】:

    是的,Google 确实实施了实体大小限制。我不知道有任何增加限制的建议。

    您可以利用的数据存储区的一个功能是您可以自动压缩存储在实体中的数据。您将使用压缩的BlobPropertyPickleProperty,如here 所述。根据数据,您可以通过这种方式在实体中存储 3MB。

    我将为您提供有关执行类似操作的更多详细信息。一个 BlobProperty 需要存储编码的文本,不能存储 unicode,所以我自己做了一个属性来自动编码和解码:

    class UTF8BlobProperty(ndb.BlobProperty):
    
        def __init__(self):
            super(UTF8BlobProperty, self).__init__(default="", compressed=True)
    
        def _validate(self, text):
            if not isinstance(text, basestring):
                raise TypeError("Expected a basestring, got %s" % text)
    
        def _to_base_type(self, text):
            return text.encode("utf-8")
    
        def _from_base_type(self, text):
            return text.decode("utf-8")
    

    一个实体然后像这样使用它:

    class MyEntity(ndb.Model):
        data = UTF8BlobProperty()
    

    之后,您只需像使用任何其他属性一样使用它。我一直想修改它,以便当压缩数据太大时它会自动将数据存储在 Google Cloud Storage 中,但还没有开始需要它。

    【讨论】:

    • 昨晚阅读他们的所有文档时,我确实错过了 compress 关键字。刚刚尝试压缩几个完整的页面(甚至没有清理)并从 1.8MB 到 270kb,所以绝对是一个很好的解决方案。我可能会这样做,或者将其存储在其他地方并链接到它(但这将是另一个 api 调用。)非常感谢
    • @Lazhar,请参阅我的更新答案以获取更多有用信息。
    【解决方案2】:

    您可能需要查看 Google 的 Cloud Firestore。与 Cloud Datastore 一样,它是一个 NoSQL 数据库,但它遵循文档模型。 Cloud Datastore 拥有实体的地方 Cloud Firestore 拥有文档。 Firestore 文档和 Datastore 实体都具有相同的 1MB 限制,并且两个数据库都支持分层模型。借助 Firestore 的分层模型,可以将文档分组为 集合,而 Datastore 将其实体分组为 种类

    但是使用 Firestore 的分层模型,您可以将集合嵌套在文档中而不会影响 1MB 的限制(相反,您不能在数据存储实体中嵌入一种类型,您能做的最好的事情就是在其中嵌入一个实体另一个实体,但对 1MB 限制有贡献)并使用该机制,您可能能够根据您的用例解决 1MB 限制。

    【讨论】:

      【解决方案3】:

      在这种情况下,Datastore 可能不是您的最佳选择,但另一方面,请查看 Google Cloud Storage,它允许您在其中存储更大的对象。默认情况下,最简单的上传方法允许您存储最多 5 MB 的文件。使用可恢复上传方法,您可以存储超过 5 MB 的限制,最高可达 TB。

      Datastore 和 MongoDB 非常适合 JSON 数据格式,但在您的示例网页中,理想情况下更可能是 HTML 或文件集,当然如果您不打算制作网页保存前存档或预处理。

      无论如何,我认为如果您没有纯 JSON 数据,那么 Datastore 以及 MongoDB 将无法理想地满足您的需求。

      【讨论】:

      • Datastore 适用于多种类型的数据,与其他数据格式相比,存储 JSON 并没有什么特别的好处。
      • @Jeff O'Neill,没错,但这就像说 Datastore 非常适合存储 XML 或二进制文件一样。此类型需要转换为字符串才能存储。
      • 只需阅读您的答案,是的,我们可以为此使用 Blob 类型。这样你就知道了。我完全忘记了。但是,3 MB 可能对这种情况没有太大帮助,存储可能是另一个更合适的选择。
      • 那么好消息是,Storage 允许直接读取它。您可以上传您的文件,使其公开可见,然后,为了根据请求获得漂亮的域名,只需通过 nginx 代理它,因此该文件将直接加载而无需任何计算时间。
      • 如果你不需要漂亮的名字,你可以直接在google生成的url下阅读这个文件,模式简单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2012-06-14
      • 2019-10-27
      相关资源
      最近更新 更多