Google Datastore从PHP AppEngine非常慢

时间:2019-03-17 05:36:45

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

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

我一直看到每个查询最多延迟0.35秒。甚至对于数据存储中实体少于100个的简单查询。

我的Web应用程序需要根据每个请求进行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令牌(无影响)

  • 已确认的数据存储区和App Engine实例位于同一区域

  • 确认index.yaml设置正确

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

  • 其他数据库后端工作正常(Cloud SQL服务器在<0.1秒内返回)。本地数据存储模拟器也将在<0.01秒内返回。

我该如何改善这种延迟?

2 个答案:

答案 0 :(得分:1)

我不确定这是否可以作为答案,但我将尽力帮助您使用堆栈驱动程序对其进行调试。

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

寻找慢速处理程序。

gae_log_message

将鼠标悬停在“等待时间”列上,然后单击。这将带您进入Stack Driver监视中的分布式跟踪系统。可能可以确认数据存储缓慢,但希望它可以揭示导致速度缓慢的其他原因。

它看起来像这样:

stack_driver_tracing

答案 1 :(得分:0)

最大的瓶颈是与数据存储区建立连接(这可能需要200毫秒的时间,这是身份验证高速缓存可以提供帮助的地方)。不幸的是,这对于php来说是个坏消息,因为我们无法建立永久连接。数据存储区客户端需要根据每个请求重新连接。

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

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

cron服务获取的批处理更新还可以帮助更快地释放请求。通知可以推送到Websocket或在后续请求中提取。

您没有提及它,因此不清楚您是否使用gRPC,如果安装了模块,则DatastoreClient默认情况下将使用grpc,否则会退回到{{ 1}},相比之下要慢得多。

要检查是否安装了REST

grpc

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