我在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调用不再关闭!
ReadTimeout
;我认为最好的做法是设置默认ReadTimeout
。如何做?
您不需要ReadTimeout;在初始EventSource/server Sent Events(SSE)连接之后,服务器将永远不会从客户端读取任何内容。
因此,使用SSE连接设置默认读取超时不是最佳做法,因为读取超时总是会被命中。您无法通过最初的SSE GET请求发送更多数据。
您应该将SSE基本上视为一个永远不会关闭的GET请求,因为它几乎就是字面意思。这意味着它在大多数代理服务器上运行良好,而在它不运行的地方(代理服务器应用自己的超时),客户端将自动重新连接,这实际上是一个非常好的功能,在webockets中找不到(尽管大多数webocket客户端库确实实现了它)。
您可能想通读这篇文章,了解更多关于苏格兰和南方能源公司(SSE)的伟大(但不是那么伟大)的事情:https://www.smashingmagazine.com/2018/02/sse-websockets-data-flow-http2/
关于您的另一个问题,您可能正在寻找HTTP路由库,该库允许您对一些GET请求应用超时,而不是其他请求,但问题是为什么;如果您试图防止资源流失,那么应该在所有endpoint上均匀地应用该保护。
我正在开发一个连接到服务器的web应用程序,我需要服务器在给定的时间向客户机推送一些信息。 有人会强调这些技术吗(也许还有其他一些推动技术。)这符合我的问题,哪一种情况更适合每一种情况? 非常感谢,我想我在这个领域完全迷失了。
我有一个关于不和的问题。皮耶。我运行我的bot所在的两个独立服务器:测试服务器和主服务器。问题是,当我在测试服务器中发送消息时,bot会将其消息发送到主服务器,而不会将其发送回调用命令的服务器(仅在函数中)。 例如: 如果我在测试服务器中键入上述内容,我的bot将以“你好!”在测试服务器中。但是,如果我尝试将此代码放入函数并调用它: 通道ID显然设置为特定服务器。因此,假设我将ID“1234”作为
概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“
概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“
如果我正确理解了服务器发送事件的原则,那么每次客户端注册到EventSource时,它实际上会打开一个到管理事件的资源的新HTTP连接。与其他HTTP请求相反,连接保持活动状态,因此专用于此客户端的服务器进程/线程将一直运行,直到客户端断开连接。 如果我们有1000个客户端使用SSE连接到一个应用程序,该怎么办?我们是否会有1000个进程/线程(做同样的事情)并发运行以处理SSE?我想我错了,但如
问题内容: 我正在尝试用golang写一个Web服务器来处理地理编码请求。其中一些请求需要花费一分钟以上的时间来处理。在这种情况下,尽管处理程序一直在运行,但是服务器似乎正在向客户端返回一个空的主体。我尝试了下面的代码无济于事。我想念什么吗?pat这可能是个问题吗? 客户是红宝石。但我不认为这是问题所在,因为如果使用curl,我会看到类似的行为。 问题答案: 找到了问题。我没有提到我的服务器在Am