我所在的公司在 4 月份决定将后端服务迁移到 Google App Engine。到今天为止一切都很顺利。我们有用于处理 REST API 调用的标准服务以及用于处理 WebSocket API 的 Flex 服务。几个小时前,我们的 Flex 服务开始对 WebSocket 握手做出 502 响应。Flex 服务的日志中没有错误,但有多个错误,如下所示:
{
"insertId": "1cu1r4ugayjsq18",
"jsonPayload": {
"operation": {
"zone": "europe-west3-c",
"type": "operation",
"name": "operation-1602285169497-5b145165b53ce-38a5e996-d4a261fe",
"id": "8770045770006876317"
},
"error": [
{
"code": "ZONE_RESOURCE_POOL_EXHAUSTED",
"location": "",
"detail_message": ""
}
],
"trace_id": "operation-1602285169497-5b145165b53ce-38a5e996-d4a261fe",
"version": "1.2",
"event_subtype": "compute.instances.insert",
"actor": {
"user": "[email protected]"
},
"event_type": "GCE_OPERATION_DONE",
"resource": {
"id": "4266532621802885278",
"type": "instance",
"zone": "europe-west3-c",
"name": "aef-socket--server--prod-20201002t220627-hdzf"
},
"event_timestamp_us": "1602285178688704"
},
"resource": {
"type": "gce_instance",
"labels": {
"instance_id": "4266532621802885278",
"project_id": "automatic-rock-252916",
"zone": "europe-west3-c"
}
},
"timestamp": "2020-10-09T23:12:58.688704Z",
"severity": "ERROR",
"labels": {
"compute.googleapis.com/resource_zone": "europe-west3-c",
"compute.googleapis.com/resource_type": "instance",
"compute.googleapis.com/resource_name": "aef-socket--server--prod-20201002t220627-hdzf",
"compute.googleapis.com/resource_id": "4266532621802885278"
},
"logName": "projects/automatic-rock-252916/logs/compute.googleapis.com%2Factivity_log",
"receiveTimestamp": "2020-10-09T23:12:58.720000801Z"
}
请注意标签中的“socket--server--prod”,这是我们的 App Engine Flex 服务的名称,也是我怀疑此错误可能与我们的问题相关的唯一原因,因为该错误不是来自 App Engine 日志,它只是我在查询所有 GCP 日志中的所有错误日志时发现的。
这次我们通过重新部署解决了这个问题
gcloud app deploy socket-server.prod.yaml --stop-previous-version
命令,但实际问题是
实例崩溃,但没有任何明显原因。我们没有遇到高负载,上次重新部署该服务是在它崩溃前 7 天,所以除了一些内部 GCP 问题(ZONE_RESOURCE_POOL_EXHAUSTED 错误代码也表明了这一点)之外,我没有任何想法。
尽管重新部署服务足以解决问题,但 App Engine 却没有这样做。直到今天,我才确信自动扩展和重新启动崩溃的实例是 App Engine 的主要功能之一,但现在我非常困惑。我的意思是,我们每月为 App Engine 服务支付约 250 美元,但它无法保证我们的服务不会随机崩溃且没有任何通知。在这种情况下,我们的实时生产服务停机了几个小时,我们只是从用户报告中了解到这一点。
没有客户支持。我在 GCP 控制台中找到的唯一支持联系人是关于计费问题的,以及一个指向 stackoverflow/serverfault 的链接,所以我来这里了。
我的问题是:
这一切都没问题吗?如果我想让服务不间断运行,我是否应该自己定期检查服务,或者是否有某种方式可以配置 Flex 使其自动重启?
ZONE_RESOURCE_POOL_EXHAUSTED 错误代码是什么,它是否与我的服务崩溃有关,是否可以采取任何措施(从我目前在 Google 上搜索的结果来看,没有,但希望如此)。
您在使用 App Engine 时是否遇到过类似的问题并成功解决了?
最后,但并非最不重要的一点是,如果是他们的错,GCP 是否欠我们停机费用?如果是,如何检查和/或证明这是他们的错?
抱歉,这个提问帖不够严谨,但我不知道我还能在哪里发帖寻求帮助。如果你知道更好的方法,请告诉我。
答案1
- 这一切都没问题吗?如果我想让服务不间断运行,我是否应该自己定期检查服务,或者是否有某种方式可以配置 Flex 使其自动重启?
您可以使用 GCP 服务之一,谷歌云监控获取您认为重要的数据,并在您的实例发生重大变化时设置警报。
- ZONE_RESOURCE_POOL_EXHAUSTED 错误代码是什么,它是否与我的服务崩溃有关,是否可以采取任何措施(从我目前在 Google 上搜索的结果来看,没有,但希望如此)。
当您需要的 Google Cloud 资源当前不可用时,会发生 ZONE_RESOURCE_POOL_EXHAUSTED 错误代码。建议您在多个区域和地区之间部署和平衡工作负载,以降低发生中断的可能性,并在需要快速扩展时访问多个资源池。Google 公开文档概述了如何在 Google Cloud Platform 上构建弹性且可扩展的架构。此外,您还可以按需使用 Google Cloud,保证 Google Cloud 容量。
- 最后,但并非最不重要的一点是,如果是他们的错,GCP 是否欠我们停机费用?如果是,如何检查和/或证明这是他们的错?
您可以使用Google Cloud 支持,如果你订阅了任何付费支持,否则你可以提交公共问题追踪(PIT)只要您遇到问题,我们都会免费为您退款。最后,您不必证明这是任何人的错。一旦确定问题的根本原因,Google 就会多次调整客户的信用。