【问题标题】:Google Datastore very slow from PHP AppEnginePHP AppEngine的Google Datastore非常慢
【发布时间】:2019-08-07 19:21:05
【问题描述】:

我正在使用官方 google-cloud-php 库从我的 PHP App Engine 实例访问 Google Cloud Datastore。

我一直看到每个查询的延迟超过 0.35 秒。即使对于数据存储区中少于 100 个实体的简单查询也是如此。

我的网络应用程序需要对每个请求进行 4 次左右的连续数据存储查询,这使得数据存储完全无法使用(每次页面加载延迟始终为 1.5 到 3 秒)

我错过了什么吗?


以下是我连接到数据存储的方式:

        // Same issue even without 'authCache' (a memcached wrapper).
        $authCache = new DatastoreAuthCache();
        $datastore = new DatastoreClient([
            'projectId' => AppIdentityService::getApplicationId(),
            'authCache' => $authCache
        ]);
        Datastore::$ds = $datastore;

以下是我的两个查询示例:

    // Lookup by keys.
    $ds = Datastore::get();
    $queryResults = $ds->lookupBatch($keys);
    $rows = keyValue($queryResults, "found");

    // Query by fields.
    $query = $ds->query()
        ->kind(self::EntityName)
        ->filter('owner', '=', $a)
        ->filter('target', '=', $b)
        ->limit(1)
        ->keysOnly();

    $results = $ds->runQuery($query);
    foreach ($results as $entity) {
        return $entity;
    }

这种延迟水平是可以预期的吗?我可以缓存一些结果,但不是全部,所以我希望这是我的问题。

这是我已经尝试改善延迟的方法:

  • 添加了“authCache”处理程序以缓存数据存储 API 令牌(无影响)

  • 确认数据存储和应用引擎实例在同一区域

  • 确认 index.yaml 设置正确

  • 确认延迟是由于数据存储调用而不是业务逻辑引起的

  • 其他数据库后端工作正常(Cloud SQL 服务器在

我可以做些什么来改善这种延迟?

【问题讨论】:

  • 无法真正回答是否会出现延迟,但也许至少让您感觉更快的一种解决方案是将您的查询代码移动到 AJAX 调用。这样,您页面的其余部分可以加载得更快,然后您就可以等待数据了。也许这只是转移了问题,但我想如果你愿意,我会提供它。
  • 嗯,这可能有很多原因......有没有一种方法可以让我们实时查看和检查您的项目?
  • 该服务是一个移动应用后端,所以很遗憾我认为没有简单的方法可以做到这一点
  • 我还尝试使用 'keyFilePath' 参数来加载服务帐户凭据而不是应用程序默认凭据,但我的查询仍然需要大约 0.6 秒的时间

标签: php google-app-engine google-cloud-platform google-cloud-datastore google-app-engine-php


【解决方案1】:

最大的瓶颈是建立与 Datastore 的连接(这可能需要 200 毫秒,这是 auth 缓存的帮助)。不幸的是,这对 php 来说是个坏消息,因为我们无法建立永久连接。 Datastore 客户端需要在每次请求时重新连接。

尝试优化时变得更加困难,因为它严重依赖延迟加载。似乎最有效的是为所有请求重用相同的数据存储客户端实例。

限制过滤器的数量可以加快查询速度,取而代之的是检索更大的数据块,然后可以在本地进行过滤。使用redis 之类的东西也可以兼作数据缓存。

cron 服务获取的批处理更新也有助于更快地发布请求。通知可以推送到 `websocket 或在后续请求中获取。

你没有提到它,所以不清楚你是否使用gRPCDatastoreClient 如果安装了模块,默认情况下将使用grpc,否则它会回退到REST,这在比较。

检查您是否安装了grpc

php -m|grep grpc

我能想到的唯一其他建议是索引,但这只会对大型数据集有所帮助。您还应该尝试在另一个数据中心进行测试,您所在的数据中心可能会出现拥塞。

【讨论】:

    【解决方案2】:

    我不确定这是否可以作为答案,但我会尝试帮助您使用 Stack Driver 对其进行调试。

    在 Cloud Console 中查看您的日志 - https://console.cloud.google.com/logs/viewer

    寻找慢速处理程序。

    将鼠标悬停在延迟列上并点击。这将带您进入 Stack Driver 监控中的分布式跟踪系统。这可能会确认 Datastore 速度很慢,但希望它能够阐明导致速度缓慢的其他原因。

    它看起来像这样:

    【讨论】:

    • 谢谢,我不知道这个!我看到大约一百个 /remote_socket.Connect .Receive 和 .Poll 条目——这正常吗? .Poll 似乎是这里的问题方法,因为它导致了大部分数据存储延迟。这是截图:prnt.sc/n1x19g
    • 我最近在 AppEngine 上使用 cURL 进行 REST API 调用时看到了这一点。您使用的是哪个 PHP 运行时?您可能会更好地切换到 Protobuf API
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2011-11-11
    • 2015-12-19
    • 2014-11-30
    相关资源
    最近更新 更多