当发送到云运行服务的 HTTP 请求被发起服务取消时,取消/关闭的连接不会传播到云运行容器内正在服务的请求。
示例代码:
package main
import (
"log"
"net/http"
"os"
"time"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
select {
case <-ctx.Done():
log.Printf("context cancelled")
case <-time.After(time.Minute):
w.Write([]byte("OK"))
log.Printf("request completed. path=%s", r.URL.Path)
}
})
log.Fatal(http.ListenAndServe(":"+port, nil))
}
Run Code Online (Sandbox Code Playgroud)
在本地运行此代码,发送到http://localhost:8080然后使用 ctrl-c 取消的curl 请求将在日志中显示为“上下文已取消”。与在云运行中部署并取消的服务相同的请求将在 1 分钟后在日志中显示为成功请求。
语境
我正在 Cloud Run 上运行 SpringBoot 应用程序,该应用程序使用 Hikari 连接池连接到 postgres11 CloudSQL 数据库。我使用的是最小的 PSQL 实例(1vcpu/614mb/25 连接限制)。对于设置,我遵循了以下资源:
问题
部署第三个修订版后,出现以下错误:
FATAL: remaining connection slots are reserved for non-replication superuser connections
我发现了什么
默认连接池大小为 10,这就是为什么它在第三次部署时失败 (30 > 25)。
删除旧版本时,Cloud SQL 管理面板中显示的活动连接数会减少 10,并且下一次部署会成功。
问题
看来,旧的 Cloud Run 修订版一直处于“冷”状态,以维护其连接池。有没有办法关闭这些连接而不删除修订?
在最佳实践部分,它说:
...我们建议您使用支持连接池的客户端库,该连接池可以自动重新连接断开的客户端连接。”
鉴于旧版本似乎以某种方式设法维护其连接,在 Cloud Run 中管理连接池的推荐方法是什么?
谢谢!
postgresql google-cloud-sql google-cloud-platform hikaricp google-cloud-run
文档描述 hasura 需要带有 HASURA_GRAPHQL_DATABASE_URL环境变量的 postgres 连接字符串。
例子:
docker run -d -p 8080:8080 \
-e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@hostname:port/dbname \
hasura/graphql-engine:latest
Run Code Online (Sandbox Code Playgroud)
看起来我的问题是 google cloud sql 的服务器实例连接名称看起来PROJECT_ID:REGION:INSTANCE_ID不是 TCP
从云运行文档(https://cloud.google.com/sql/docs/postgres/connect-run)我得到了这个例子:
postgres://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432但它似乎不起作用。有想法吗?
我目前正在将其cloud_sql_proxy作为解决方法添加到容器中,以便我可以连接到 TCP 127.0.0.1:5432,但我正在寻找与 google-cloud-sql 的直接连接。
// 编辑感谢您的评论,beta8 做了大部分的技巧,但我也错过了参数set-cloudsql-instances: https: //cloud.google.com/sdk/gcloud/reference/beta/run/deploy#--set-cloudsql-instances
我的完整云运行命令:
gcloud beta run deploy \
--image gcr.io/<PROJECT_ID>/graphql-server:latest \
--region <CLOUD_RUN_REGION> \
--platform managed \
--set-env-vars HASURA_GRAPHQL_DATABASE_URL="postgres://<DB_USER>:<DB_PASS>@/<DB_NAME>?host=/cloudsql/<PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>" \
--timeout 900 \
--set-cloudsql-instances <PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>
Run Code Online (Sandbox Code Playgroud) 我目前正在使用 kubernetes 运行 keycloak,没有任何问题。一切都按预期进行,但我想切换到云运行(完全托管),目前 keycloak 给我带来了一些问题:
我注意到在云运行中你无法通过 tcp 连接到 mysql 数据库(google sql 第二代),但我没有找到任何有关如何设置 keycloak 以使用套接字连接的文档。目前使用 keycloak 可以实现这一点吗?
我正在使用 Cloud Run 创建数据提取管道。每次通过 Pub Sub 将文件放入 GCS 存储桶时,我的 Cloud Run api 都会被调用。我需要加载一些元数据,其中包含我正在摄取的数据的文本。此元数据很少更改。我显然不想在每次执行时将其重新加载到内存中。我最好的选择是什么?到目前为止我能够研究的是:
选项1
如果在每个服务请求上重新创建对象的成本很高,您还可以将对象缓存在内存中。将其从请求逻辑转移到全局范围会带来更好的性能。 https://cloud.google.com/run/docs/tips#run_tips_global_scope-java
在此链接给出的示例中,heavyComputation 函数仅在冷启动时调用一次吗?如果我需要在元数据更新时偶尔重新触发此功能怎么办?我还发现以下信息令人不安,因为它似乎说不能保证其他实例会重用该对象。
在 Cloud Run 中,您不能假设服务状态在请求之间保留。但是,Cloud Run 确实会重用各个容器实例来服务持续的流量,因此您可以在全局范围内声明一个变量,以允许在后续调用中重用其值。无法提前知道是否有任何单独的请求能够从这种重用中获益。
选项2
使用 Redis 或云内存存储之类的东西,只要有变化,云功能就会更新。所有云运行 api 的实例都从 Redis 中提取元数据信息。这会比选项 1 的性能更低还是更高吗?这还有其他缺点吗?
如果还有其他更好的方法可以做到这一点,我会很感兴趣。
更新 1:我更多地考虑了这一点,由于每个租户的元数据都会有所不同,并且每次调用云运行代码都会为一个租户摄取一个文件,因此加载所有租户是一个坏主意每次执行时的元数据,即使已缓存。不过,我可能会在每个租户的项目中运行单独的云。
shared-memory data-ingestion google-cloud-memorystore google-cloud-run
我创建了一个简单的 Google Cloud Run 帮助程序(不处理任何个人数据,也不使用任何存储设施),并在网站内为其实现了一个公共界面(使用 HTML 请求)。我不打算添加任何用户身份验证,并且我还开源了 Cloud Run 容器中的代码。
我是否应该采取任何进一步的措施来保护容器免受恶意用户的侵害?有人可能会因为请求而使应用程序超载,从而超出容器的免费调用限制(导致我自己被计费)吗?我主要只是想确保我永远不会为 Cloud Run 应用程序付费,因为它只是充当有限数量用户的小型帮助工具。
谢谢。
我将 Cloud Run 与 Node 运行时结合使用。我的静态文件服务器将提供 gzip 和 brotli 压缩文件(如果存在),因此我已为所有资产预先生成了它们。在本地,这效果很好,但一旦部署,Cloud Run 就会剥离内容编码响应标头,以便浏览器误解响应并呈现垃圾。
我找不到任何有关使用 Cloud Run 进行标头过滤的文档,但我在 App Engine 上找到了一些文档,表明它会过滤掉 Accept-Encoding 请求标头和 Content-Encoding 响应标头。如果是这种情况,我认为我的应用程序将提供未压缩的资源。
有人知道这是怎么回事吗?
我需要将 dotnet Web 应用程序部署到 Google Cloud Run,并希望使用用户机密文件来存储凭据。目前,它们位于不安全的应用程序设置中。有人使用 Google Secret Manager 完成过此操作吗?
如果有现有的示例或片段,我们将不胜感激。
谢谢。
c# google-cloud-platform .net-core google-cloud-run google-secret-manager
此问题发生在 Nginx 和 PHP-FPM 提供的纯 PHP 文件上。我在使用 Symfony 开发网站时偶然发现了这个问题,但有问题的内容长度范围是 3702-15965 (我想知道为什么它与普通 PHP 不同)。
到目前为止我尝试过的:
笔记:
任何帮助表示赞赏。谢谢。
我正在使用 Dockerfile 将 create-react-app 服务部署到 Google Cloud Run 上,但我想不再在 .env 文件中声明环境变量,而是在 Google Cloud Run 的仪表板上声明它们,如下所示:

但是,当我使用以下命令调用环境变量时
console.log("REDIRECT", process.env.REACT_APP_REDIRECT_URI)
Run Code Online (Sandbox Code Playgroud)
我尝试引用的任何环境变量都会返回 null。是否还有另一个步骤来访问我缺少的这些变量?
这是我的 Dockerfile:
FROM node:10-alpine as react-build
WORKDIR /app
COPY . ./
RUN yarn
RUN yarn build
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/configfile.template
ENV PORT 8080
ENV HOST 0.0.0.0
RUN sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf"
COPY --from=react-build /app/build /usr/share/nginx/html
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud) environment-variables docker reactjs google-cloud-platform google-cloud-run