缓冲对Bluemix App的http请求

时间:2017-01-18 08:54:59

标签: http ibm-cloud buffering

我在Golang上编写了一个Bluemix应用程序。我向它发送了一个大块的HTTP请求,我看到我的应用程序收到通知,它只有在请求完全到达目的地时才收到此请求,而不是在标题出现后开始(在开始时没有等待正文)。 / p>

普通服务器上的相同代码工作正常,没有任何延迟,问题似乎只有在Bluemix上运行时才会出现。我做了几个实验,比如听tcp而不是http(但仍然发送http请求),并且第一次注意到只有当请求完全到达时才有一些网络。我也尝试非常缓慢地传输数据,在100ms内传输1个字节,并发送小请求,结果是一样的。

我认为在将请求重定向到App所具有的动态端口之前或者在某个其他地方有一些缓冲。任何帮助为什么会发生以及如何避免它,将非常感激。谢谢。

UPD:Go中侦听TCP的服务器代码:

func main() {
    var port string
    if port = os.Getenv("PORT"); len(port) == 0 { port = DEFAULT_PORT }
    l, err := net.Listen("tcp", ":"+port)
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        os.Exit(1)
    }
    // Close the listener when the application closes.
    defer l.Close()
    for {
        // Listen for an incoming connection.
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting: ", err.Error())
            os.Exit(1)
        }
        // Handle connections in a new goroutine.
        go handleTCPRequest(conn)
    }
}

func handleTCPRequest(conn net.Conn) {
    fmt.Println("Got something!!!", conn)
    // Make a buffer to hold incoming data.
    buf := make([]byte, 1024)
    // Read the incoming connection into the buffer.
    reqLen, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error(), conn)
    } else {
        fmt.Println("Read: ", reqLen, buf, conn)
    }
    // Close the connection when you're done with it.
    conn.Close()
}

客户端只发送一个大的http请求或一个受限制的请求。 我希望得到印刷品" Got Something"第一个包到达后真的很快,但这不是我看到的。例如,对于限制客户端,我将把所有包装一起打印并打印出来#34;得到的东西"只有在完整包裹到货后才能使用。

Go中的限制客户端代码:

reader, writer := io.Pipe()
request, _ := http.NewRequest("PUT", URL, reader)
request.Header = http.Header{}
request.Header["Connection"]=[]string {"keep-alive"}
request.Header["X-Content-Type-Options"]=[]string {"nosniff"}
request.Header["Accept-Encoding"]=[]string{"gzip, deflate"}
request.Header["Accept"]=[]string{"*/*"}
request.Header["Transfer-Encoding"]=[]string {"chunked"}
request.TransferEncoding=[]string {"chunked"}

//puts one byte in 100ms asynchronously
go func(w *io.PipeWriter){
    i:=0
    for true {
        i+=1
        w.Write([]byte{0})
        time.Sleep(100 * time.Millisecond)
        fmt.Print("-")
        if i > 1000 {
            w.CloseWithError(io.EOF)
            break
        }
    }
}(writer)

http.DefaultClient.Do(request)

0 个答案:

没有答案