nginx加速缓存导致event-stream消息延迟问题

问题起因:

在开发我的网站谷流仓AI - guliucang.com的AI聊天助手功能模块,采用了跟chatGPT官网一样的stream流传输格式。在建立起连接并且还未断的期间,后端服务器可以主动推送消息给前端,在页面上能看到的效果就是AI回复的消息是一个字一个字打印出来的,而在浏览器的控制面板可以看到接口的response Content-Type是text/event-stream。

我在本地调试的时候,一切都正常,前端看到字是一个一个打印出来的。但是发布到云服务器之后,发现实际效果是AI发回来消息的时候,直接显示一大段文字,然后卡顿2秒,然后又是直接显示一大段文字。整个过程看起来就很卡顿。下面来回顾一下这个问题的排查流程。

问题排查 & 解决办法

首先,理清整个链路,如下图
AI返回消息流程

  1. 本地启动前端项目,连接本地服务,页面展示效果正常。连接云端服务器, 页面就出现了类似卡顿的现象。这样就排除了前端渲染的问题,同时也排除了节点1的问题
  2. 打开浏览器控制台,查看该接口的获取到event stream的时间节点,发现接收到的数据是一批一批的,比如在第一秒的几百毫秒内瞬间收到了几十个响应,然后过了2秒,又在几百毫秒内收到几十个响应,但是在本地的时候,接受到的stream时持续不断的,不可能中断2秒,然后又瞬间发送。推测是java应用发送响应到nginx之后,被nginx缓存起来了,缓存到一定数据量之后,再统一发送到浏览器客户端。

在经过大量面向百度后,怀疑是proxy_buffer的问题,于是在nginx针对该接口添加了如下配置

# http模块添加tcp_nodelay尝试让nginx直接将数据发送至客户端
tcp_nodelay on;
# server下的location模块针对该接口设置禁用缓存
proxy_buffering off;
proxy_cache off;
proxy_buffer_size 0;
proxy_http_version 1.1;

事实证明这些配置完全没起作用.
然后还是去stackoverflow, 找到了一个解决方法,就是在接口返回的header上添加X-Accel-buffering:no

return ResponseEntity.ok()
                .header("X-Accel-Buffering", "no")
                .body(stringFlux);

再次尝试,发现已经是和本地一样的展示效果了。至此,问题排查结束,就是nginx的加速缓存导致的。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx是一种高性能的Web服务器和反向代理服务器软件,可以在Linux、Windows、UNIX等操作系统上运行。它以其稳定性、高并发性和低内存消耗而受到广泛关注和使用。 nginx 1.18是nginx的一个版本,其中包含了一系列的新特性和改进。这个版本引入了新的HTTP/2服务器推送功能,提供了更好的性能和可扩展性。同时,该版本还增加了对TLS 1.3的支持,加强了传输层安全性。此外,nginx 1.18还改进了负载均衡算法,提高了对后端服务器的请求分发效率。总之,nginx 1.18在性能、安全性和功能上都有所提升,是一个值得使用的版本。 nginx-mod-stream是一个nginx模块,用于处理TCP/UDP流量。它提供了一系列的功能,如四层(网络层)和七层(应用层)的负载均衡、流量分片、数据重定向等。通过使用nginx-mod-stream,我们可以在一个单独的nginx服务器上同时处理HTTP和TCP/UDP流量,增加了服务器的灵活性和可扩展性。 通过将nginx 1.18和nginx-mod-stream结合使用,我们可以构建一个强大的、高性能的网络架构。nginx 1.18提供了优秀的HTTP服务和反向代理能力,而nginx-mod-stream则提供了处理TCP/UDP流量的功能。这样可以让我们的应用程序更加灵活,在一个服务器上同时处理不同类型的流量,提高服务器的利用率和性能。因此,nginx 1.18和nginx-mod-stream是两个重要的组件,能够帮助我们构建高效的网络架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值