当发送到云运行服务的 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))
}
在本地运行此代码,curl 请求发送到http://本地主机:8080 http://localhost:8080然后使用 ctrl-c 取消将在日志中显示为“上下文已取消”。与在云运行中部署并取消的服务相同的请求将在 1 分钟后在日志中显示为成功请求。
我认为 Cloud Run 如今无法提供这样的保证。
我猜这是因为实施细节。 Run 服务的外部流量不会直接进入容器,而是通过一个或多个负载均衡器和代理。这些负载均衡器/代理可能无法正确传播客户端断开连接(或者只是缓冲请求/响应)。这将导致您所看到的行为。
我将继续提交有关它的内部功能请求。感谢您提出来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)