我在Heroku上使用这个惊人的Golang(https://github.com/r3labs/sse)SSE服务器。
存在超时限制:https://devcenter.heroku.com/articles/request-timeout#long-轮询和流式处理响应:
如果要发送流式响应,例如服务器发送事件,则需要检测客户端何时挂起,并确保应用服务器立即关闭连接。如果服务器保持连接打开55秒而不发送任何数据,您将看到请求超时。
我知道在WebSocket世界中,有一个保持ping的概念。
我正在尝试使用此代码:
go func() {
for range time.Tick(time.Second * 1) {
fmt.Println("a second")
sseServer.Publish("test", &sse.Event{Data: []byte("ping")})
}
}()
使用以下简单服务器:
httpServer := &http.Server{
//...
ReadTimeout: "10s",
WriteTimeout: "10s",
}
但它不起作用。通话在10秒(和10次ping)后结束。
我认为Heroku也会失败。
我错在哪里?
我们可以只更改这些SSE调用的超时吗?
还有别的办法吗?
更新
我不需要准确检测断开连接的客户端,我一点也不在乎。当服务器上发生某些事情时,我正在使用它来刷新仪表板。
我不喜欢将WebSocket用于如此简单的事情。
我想我没有很好地解释我自己,因为我不想使用ping来检测断开连接的客户端,而是因为我希望连接不会被中断(就像Heroku上发生的那样)。
如果在Windows和Docker linux容器上完全删除ReadTimeout字段,连接不会停止,一切正常。
因为在Heroku上,连接每55秒就会因为超时而下降,我在第一篇文章中告诉过你,我用那个非常简单的代码尝试了那个循环,它起作用了:SSE调用不再关闭!
ReadTimeoutReadTimeout
如何做?