首页 > 解决方案 > 评估 Google Cloud Storage (GCS) API 选项

问题描述

我的任务是开发一个接口层,供其他开发人员在内部使用,作为访问 Google Cloud Storage (GCS) 的一种方式。对我来说,这个过程是从阅读在线文档开始的。我现在正在决定我们将使用哪个 API。有几个悬而未决的问题,并且该文档提到向 SO 发布问题,所以我在这里。一个快速的背景花絮似乎是有序的。我们主要是 C 公司,尽管我们确实有办法从 C 构建和调用 C++ 方法。内部用户将编写调用我的 C 代码的 C 代码,而这又必须提供对 GCS 的访问。这就是高级调用堆栈。那么问题就变成了我如何以最佳方式提供访问权限,而性能是最高标准?

为了回答这个问题,我首先阅读了有关不同 GCS 选项的在线文档。有一个 XML 和一个 JSON REST API。我们有一个内部 HTTP 机制,可以让 C 代码直接调用那些 JSON/XML API 方法。该文档指出以下内容:

“...JSON API 是 RESTful...并且专门用于与 Google Cloud 客户端库一起使用。”

我想知道什么是 Google Cloud 库。阅读文档后发现它们是用特定语言编写的库,可用于访问 GCS。该文档似乎引导您使用这些客户端库之一而不是 JSON/XML 库。

所以我遇到的第一个问题是“‘特定意图’的业务到底是什么意思?”阅读更多内容后,我想到这些客户端库是 RESTful 接口的抽象。这些库调用 JSON API 方法,只是就像您可以直接通过 JSON API 自己做的那样。正确吗?如果是这样,它们似乎是与 GCS 交互的一种方便方式。文档甚至指出,与 JSON 相比,云库“......提供更好的性能和可用性” HTTP 接口。

最后,我看到了两条前进的道路:

  1. 使用我们的 HTTP 机制直接从 C 调用 JSON API
  2. 使用桥从 C 调用 C++ 方法。然后这些 C++ 方法调用客户端库中的方法,最终(如果上述内容正确)调用 JSON API。

请注意,我已经在内部编写了一些 C 代码,它们使用上述内部 HTTP 机制与 Apache WebHDFS API 进行交互,该 API 也是 RESTful 并且没有客户端库。因此,我可以利用该代码的相当一部分在这个新开发中重用。对我来说,这归结为一个性能问题。与第一个选项相比,上面的第二个选项似乎相当迂回。因此,第一个似乎比第二个产生了一些性能改进。然而,谷歌提到客户端库提供了比 RESTful API 更好的性能。那个怎么样?该文档指出客户端库处理与服务器的所有低级通信,包括身份验证。这是部分原因吗?

因此,我向那些对 GCS(可能还有 GCP)更有经验的人提出了这个问题:在您看来,哪条路线会提供更好的性能?直接调用 JSON API 还是使用客户端库(在我们的例子中是 C++)?谢谢!

标签: c++jsongoogle-cloud-storage

解决方案


免责声明:我为 Google Cloud 开发 C++ 客户端库,特别是 C++ GCS 库。

然而,谷歌提到客户端库提供了比 RESTful API 更好的性能。那个怎么样?

这些库被调整为“很好”地使用 RPC。他们对重试和退避策略有很好的默认值,如果有两种选择,他们会选择正确的 RPC。他们可以从中断的下载或上传中有效地恢复。他们可以实现更高级别的抽象来提高性能。

如果您问“如何运行他们的代码来调用 RPC 比我调用相同的 RPC 更有效”,那么答案是“可能不能”。我不认为这是一个有趣的问题。例如,如果你想上传一个大文件(比如多个 GiB),在 GCS 中最有效的方法是将文件分割成块,使用多个并行上传到不同的 GCS 对象,然后组合对象,并删除中间对象。这将比按顺序上传文件快几倍。你能做同样的事情吗?当然!你想要_____吗?也许不吧。

我们还担心正确恢复中断的下载。并在上传和下载数据时验证数据的完整性(当然,您可以关闭这些功能)。

最后,如果有更有效的做事方式,我们可以在底层更改协议。例如,我们已经在 XML 和 JSON 之间切换,当我们两者是等效的并且其中一个似乎比另一个执行得更好时。我们还在努力支持 gRPC 而不是 REST,这在 REST 基线上显示出良好的改进(不幸的是,它还不是 GA,而且我没有估计日期)。

高温高压


推荐阅读