[英]Google AppEngine + PHP + Google Cloud Datastore: receiving Unauthorized
[英]Google Datastore very slow from PHP AppEngine
我正在使用官方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 令牌(无影响)
确认数据存储和应用引擎实例在同一区域
确认 index.yaml 设置正确
确认延迟是由于数据存储调用而不是业务逻辑
其他数据库后端工作正常(Cloud SQL 服务器在 < 0.1 秒内返回)。 本地数据存储模拟器也在 <0.01 秒内返回。
我可以做些什么来改善这种延迟?
我不确定这是否符合答案,但我会尝试帮助您使用 Stack Driver 对其进行调试。
在 Cloud Console 中查看您的日志 - https://console.cloud.google.com/logs/viewer
寻找慢处理程序。
将鼠标悬停在延迟列上并单击。 这将带您进入 Stack Driver 监控中的分布式跟踪系统。 这可能会确认 Datastore 很慢,但希望它会揭示导致缓慢的其他原因。
它看起来像这样:
最大的瓶颈是建立与 Datastore 的连接(这可能需要 200 毫秒,这是身份验证缓存的帮助所在)。 不幸的是,这对 php 来说是个坏消息,因为我们无法建立永久连接。 Datastore 客户端需要在每次请求时重新连接。
尝试优化时会变得更加困难,因为它严重依赖延迟加载。 似乎最有效的是为所有请求重用相同的数据存储客户端实例。
限制过滤器的数量可以加快查询速度,取而代之的是检索更大的数据块,然后可以在本地过滤这些数据。 使用诸如redis
之类的东西,它也可以兼作数据缓存。
由cron
服务获取的批处理更新也有助于更快地发布请求。 通知可以推送到`websocket 或在后续请求中获取。
你没有提到它,所以不清楚你是否使用gRPC ,如果安装了模块, DatastoreClient
将默认使用grpc
否则它会回退到REST
,相比之下,它要慢得多。
要检查您是否安装了grpc
:
php -m|grep grpc
我能想到的唯一其他建议是索引,但这只会对大型数据集有所帮助。 您还应该尝试在另一个数据中心进行测试,因为您所在的数据中心可能会出现拥塞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.