Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<Title> 通过Nginx ingress 连接SSE, 需要等待大概25s 左右才能收到 Open Event #881

Open
GiKyouGetsu opened this issue Sep 11, 2024 · 5 comments
Labels
bug Something isn't working

Comments

@GiKyouGetsu
Copy link

Expected Behavior

可以直接收到Open event 不需要等待

Actual Behavior

浏览器显示 经过大概25s 才收到了 Open Event, 期间一直处于pending 状态

Specifications

  • Version:
  • Platform:
  • Subsystem:
@GiKyouGetsu GiKyouGetsu added the bug Something isn't working label Sep 11, 2024
@sunli829
Copy link
Collaborator

不通过 Nginx ingress 连接就是正常的吗?

@xingsongs
Copy link

xingsongs commented Sep 13, 2024

https://kiosk007.top/post/http2-%E6%94%AF%E6%8C%81%E5%88%86%E5%9D%97%E4%BC%A0%E8%BE%93/

应该是这个原因:
HTTP2 是不支持 HTTP1 语义下的 chunked 模式的。因为H2的 Data 帧是纯天然的Chunked模式。

这也是最容易出bug的地方,一些实现不完全的HTTP2开源库经常在这里出问题。因为我们线上都是客户端请求基本都是 chunked 模式,升级到 HTTP2 之后,经常访问一些三方链接访问卡死,最终 debug 后的原因发现出在服务端对 HTTP2 chunked 的支持上。

最常见的反向代理实现 Nginx 就是最容易有这种 bug的,很多企业维护的Nginx经常不更新,而低版本的Nginx在HTTP2上的这个bug就被我们遇到过。

具体现象是,客户端使用chunked模式上传,但是服务端开启了 HTTP2,自然客户端也就升级到 HTTP2 。但是请求总是卡主,服务端无响应。最终定位到如果 DATA帧不携带内容,只携带一个 End Stream 标志,服务端无法识别流式传输结束

@xingsongs
Copy link

xingsongs commented Sep 13, 2024

image
这样写是可以的
@sunli829 大佬能修复一下这个问题吗

@sunli829
Copy link
Collaborator

你这样写为什么可以,是因为连接上立即发送了一个消息吗?

@xingsongs
Copy link

xingsongs commented Sep 14, 2024

你这样写为什么可以,是因为连接上立即发送了一个消息吗?

是的。
如果不立即发送消息,就是下面的效果 pending:
image

因为设置了25s keep_alive, 当第一个keep_alive 达到才能成功,Protocol: h2
image

从测试来看只有http/1.1 没有问题, h2 有这个问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants