请求取消未传播到 Cloud Run 容器

5
当一个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))
}
在本地运行此代码,在发送到http://localhost:8080的curl请求被ctrl-c取消后,日志中将显示“上下文已取消”。将服务部署在云端并取消相同的请求,将在1分钟后在日志中显示为成功请求。
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5

我认为Cloud Run目前没有提供这样的保证。

我猜这是因为一个实现细节。Run服务的外部流量不直接进入容器,而是通过一个或多个负载均衡器和代理进行传递。这些LB/代理可能无法正确地传播客户端断开连接(或仅仅缓冲请求/响应)。这会导致您所看到的行为。

我将立即提交一个内部功能请求。谢谢您提出这个问题。


这个是否已经实施了?我查看了Cloud Run的公共问题跟踪器,但没有看到任何关于该问题的提及,并且在文档中也找不到任何相关信息。我希望这是预期的行为。 - ericwenn
还没有实现。 - ahmet alp balkan
这仍然是一个很好的行为。能够将请求关闭事件传播到云运行服务器。 - hellowill89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,