如何处理超时api请求
话说,我接了百度的千川4.0,因为需求不是对话型的,所以用不了流式,只能等着千川给我返回,但是这个千川的返回时间长达(60s+),经常超时,问了百度的技术,对方让我改成3.5的接口,或者增加超时等待时间
我用了队列,php 和 nginx 都设置了150秒的超时
但是,还是会偶尔提示:App\Jobs\BaiDuQianChuanJob has been attempted too many times or run too long. The job may have previously timed out
有没有什么别的更好的方法?
如果用guzzle的话需要用 options 里面的 timeout 来设置超时时间
不能回调处理吗?
所以需求的场景是什么?
感觉貌似只能延长超时时间?
Laravel 队列,Linux 下,监听超时的 sign 信号和 curl 是同一个,也就是两者超时时间要设置成一样
需求不是对话型的,不代表你不能使用流式。你完全可以建立一个链接,在这个链接只使用一次,等对方全发过来后,你就终止就是了
这也太慢了,生成几千字的文章也不至于
这一不小心网站不被卡死了
是否可以采用异步的方式进行呢,比如先返回一个默认结果给前端,之后的话将请求存入redis队列 再通过多进程方式去消费请求百度API接口,超时则进行尝试,成功之后将结果通知给用户。
这种情况只能用流式了,http下你设置多少都会有超时的情况,他们这个模型不是很稳定,哪怕你设置的150s也会超时的情况。只能用sse去接收,可以接收时不断覆盖结果,然后加个状态字段提示下生成中,有多少结果就展示多少结果,或者直接等流式结束完全覆盖结果
流式接收千川的响应,接收完了更新你的答案就可以了,不会超时的
laravel队列可以把超时设置大一点,要不就自己写个简单的队列处理, ···php while(true){ // todo redis()->lpop() ...... } ···
单独用swoole或者workman、甚至是go之类的,写一个单独脚本来进行接收处理就好。脚本通过比如队列唤醒,或者redis发布订阅、kafka之类的。然后脚本来发起请求
自己写一个回调接口,在队列收到响应的适合自己请求这个接口