nextjs 致命未解问题! sse 连接断开事件无法获取 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX    程序员

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

  •  
  •   rizon
    othorizon 156 天前 via Android 2049 次点击
    这是一个创建于 156 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 nodejs 模式下没问题。 但是在 vercel 或者 firebase 里运行时。 客户端发起的 sse 连接,当客户端断开连接时,服务端拿不到中断事件,服务端会运行到函数正常结束。

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

    大佬们有没有解决办法呢
    13 条回复    2025-05-16 14:53:10 +08:00
    beyondstars
        1
    beyondstars  
       156 天前
    先排除 vercel 或者 firebase 的因素,会不会是 client 断开了到 vercel 的连接,但是 vercel 没有断开到你部署的 app 的连接?

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

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

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

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

    ai sdk 自己封装了一套传输协议,没有用 SSE ,文档里这个中断参数测试过在 vercel 可用
    rizon
        13
    rizon  
    OP
       155 天前
    @jmllx1963 好吧,哎。那没办法了。 其实我有考虑要不要用 redis 来处理中断。想想算了,为了这么一个场景感觉不值得。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2623 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 10:02 PVG 18:02 LAX 03:02 JFK 06:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86