nextjs 致命未解问题! sse 连接断开事件无法获取

16 小时 23 分钟前
 rizon
在 nodejs 模式下没问题。 但是在 vercel 或者 firebase 里运行时。 客户端发起的 sse 连接,当客户端断开连接时,服务端拿不到中断事件,服务端会运行到函数正常结束。

这在 ai chat 类产品里很致命,用户停止事件拿不到导致服务端持续运行请求造成额外的 token 消耗。

大佬们有没有解决办法呢
792 次点击
所在节点    程序员
11 条回复
beyondstars
15 小时 44 分钟前
先排除 vercel 或者 firebase 的因素,会不会是 client 断开了到 vercel 的连接,但是 vercel 没有断开到你部署的 app 的连接?

找一个 vps 或者虚拟机进行部署。

然后你的 nextjs 的 route-handler 部分具体是怎么写的,有没有参照官方的写法 aHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vcm91
dGluZy9yb3V0ZS1oYW5kbGVycyNzdHJlYW1pbmcK (参考其中 streaming 和 ai-sdk 的部分)
rizon
15 小时 24 分钟前
@beyondstars 不用 serveless 是没有问题的,这个事情 vercel 的社区里也有讨论,都没有答案
dssxzuxc
14 小时 52 分钟前
有个办法是客户端跑路前发一个中断请求,告诉服务端这个对话可以终止了,当然有时候这个断开连接是意外导致的,比如关掉浏览器、页面崩溃,没法保证中断请求一定能正常发出,只能说这样至少能挽回一部分损失。

另外问个问题,vercel 的 AI SDK 基本是针对 Next.js 设计的,我用 Nest.js 的时候总是感觉不太好用,但是好像也没其他选择?
wangritian
14 小时 46 分钟前
让对端每 n 秒给自己发送一个心跳包,然后无限推迟一个比 n 秒多一点的 settimeout ?
rocmax
14 小时 40 分钟前
https://github.com/vercel/next.js/issues/50804
这说是修完了啊
你的情况应该是 edge runtime 导致的
rizon
14 小时 38 分钟前
@wangritian
@dssxzuxc
由于是 serveless 服务,所以客户端通知唯一的办法就是引入一个新的机制来让客户端通知服务端,整个架构变复杂了,实在是有点感觉性价比太低。 看来真的没办法解决了。

而且虽然没有测但我严重怀疑 vercel 的 ai sdk 也没解决这个问题
rocmax
14 小时 36 分钟前
昨天恰好碰到使用 server actions 处理 stream text 时无法中断的问题,ai sdk 里说 rsc 还不支持 abortSignal ,只能改成 API 了。。。
rizon
14 小时 36 分钟前
@rocmax 我不是跑在 edge runtime 下的。nodejs 的 runtime 下不行
rizon
14 小时 35 分钟前
@rocmax 我就是用的 api route 啊,没有使用 sever action 。 并不能收到 abort 事件
rizon
14 小时 8 分钟前
@rocmax 刚写了一个 edge function 做了下测试,完全没解决。根本停不下来。哎
dssxzuxc
13 小时 44 分钟前
提 issue 吧,50804 虽然说已解决,但是翻到那条 pull 的最下面评论说了有些 node 版本下依然不行。有些功能在不同 node 版本下时好时坏太正常了,或许升级/降级就解决了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1131991

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX