在 nginx 下启用 Server-sent events

最早我们系统的RPC是通过轮询实现的双向RPC,后来在这基础之上增加了基于WebSocket实现的双向RPC,再后来为了适应公司战略的需求,需要对外提供API,并让整个系统成为100% API驱动的,服务器到客户端的RPC被改为事件的形式,服务器缓存一组发送给客户端的事件,客户端然后定期来取这个,在标准客户端上这个问题不大,不过在移动客户端上就很严重了,频繁的HTTP请求会导致电池迅速用光,因此这里需要考虑使用W3C的开放标准Server-sent events来实现事件通知。

这个协议非常简单,实现就不多说了,jetty + continuation没几行代码。不过代码写好后一直无法正确将事件推送到客户端去,在Chrome的Network面板里可以看到Server-sent events请求旁边出现一行字: CAUTION: Provisional headers are shown。 只能看到request的header但却看不到response的header,这么说应该就是response没收到,但在服务器端确实已经flush了,那么问题就应该出在nginx那,nginx可能还在等待请求结束后再发给客户端,而SSE是长连接,nginx肯定一时半会是等不到结束了,控制台里看到过了一会之后SSE连接就断开了,response依然没收到,这是因为SSE的默认行为会超时后自动重连。

定位到了问题就好说了,既然是nginx缓存了请求,那么改一下配置:

location /chat/events {proxy_pass http://127.0.0.1:8084;proxy_http_version 1.1;proxy_set_header Connection '';proxy_buffering off;proxy_cache off;chunked_transfer_encoding off;}

重启一下nginx,程序正常了。

在 nginx 下启用 Server-sent events

相关文章:

你感兴趣的文章:

标签云: