我在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

如何做?