langgenius / webapp-conversation

MIT License
446 stars 837 forks source link

API访问长时间节点会中断 #109

Closed skywolf123 closed 1 month ago

skywolf123 commented 1 month ago

我遇到个问题,卡了好几天了,我用webapp-conversation访问dify工作流的API,在chat-messages长时间的节点时会中断,而我用postman去调接口却不会中断 每次中断都会发现一个自动的get请求api/messages?conversation_id=&limit=20&last_id= 这个请求会500,从而导致整体中断 但是我在webapp-conversation的代码里没找到相关的调用 仅仅发现它跟dify工作流的通信是通过dify-client这个sdk组件实现的

skywolf123 commented 1 month ago

经过持续不断的尝试,我终于明白问题所在了!

这个问题是由于部署平台的限制,比如 Vercel 和 zeabur,他们的免费计划在部署 next.js 项目时有隐含的超过一定时间不请求就会中断连接(在 zeabur 中这个时间是 30 秒)。

虽然chat-messages接口仍然在响应,但是由于没有新的请求,连接会中断。

在 zeabur 的免费计划中,可以测试性的部署为 docker 项目,这样就可以拥有更长的时间,而在一定程度上规避这个问题。

那么,我目前找到的有效方法是什么呢?

在客户端中(比如 webapp-conversation)加入一个定时请求,随便请求一个 API 的接口。

我的实践是每隔 10 秒请求 meta 接口,因为它足够简单。

具体是:

  1. 在 app\api 中加入 meta\route.ts,参考 parameters\route.ts 实现
  2. 在 app\components\index.tsx 中加入下面这段

    useEffect(() => {
    const intervalId = setInterval(() => {
      fetch('/api/meta')
        .then(response => response.json())
        .then(data => {
          console.log('/api/meta succeed:', data)
        })
        .catch(error => {
          console.error('/api/meta error:', error)
        })
    }, 10000)
    
    return () => clearInterval(intervalId)
    }, [])