我的情况是这样的:
有一个外部网站的接口,用户在我的 Laravel 站点查询某些信息时,我的站点会去请求这个外部接口,获得数据后返回给用户。 但这个外部接口不能被同时频繁请求,同时请求会被接口服务器短暂封禁 IP 半个小时,当我的站点有多个用户同时在查询信息时,就容易发生这种情况。
我想用 Laravel 的队列来处理,用户前台查询信息时,我的站点后台会将这个请求加入队列,依次去请求那个外部 API。
但 Laravel 队列是异步的,无法将队列中接口请求到的信息即时返回给用户,只能将返回的数据存储起来。
请问:
1、Laravel 队列中可以将任务的返回值返回给前台用户吗,如果有,该怎么实现?
2、对于上述我的需求,是否有更好的实现方式?(或者说,我上述需求是否符合 Laravel 队列的适用场景?如果不适合,有适合的实现方式吗)
1
freehere 2017-07-10 18:29:58 +08:00
不合适,加缓存吧,相同的东西多长时间返回相同的信息就好了,具体看你们的业务逻辑了
|
2
ghostheaven 2017-07-10 18:32:52 +08:00 via Android
ajax 轮询或者 websocket
|
3
caniuse 2017-07-10 19:03:35 +08:00
用队列是对的,你还需要即时通讯,可以考虑集成环信等免费的即时通讯功能,自己做的话可以用 socket.io 、websocket 来做。
|
4
sfree2005 2017-07-10 20:33:05 +08:00 via Android
你可以看下这个
https://laracasts.com/series/real-time-laravel-with-socket-io 关键字:redis,socket.io 结合楼上说的和链接里的 就是完整的解决方案了。 |
5
fuxkcsdn 2017-07-10 20:39:24 +08:00 via iPhone
上代理😳
|
6
chinafeng 2017-07-10 20:55:12 +08:00
队列+代理池
|
7
mingyun 2017-07-10 23:30:07 +08:00
查询时给个状态,处理中,处理完成,队列处理完就是完成状态了,可以将数据返回了
实时的话用 socket 了 |
8
flyingghost 2017-07-11 12:13:26 +08:00
你面临的是两个问题:
1,client 访问速度和 server 查询速度的冲突。异步或者缓存可破。 2,异步查到结果后如何告知的问题。轮询或者 socket 主动推可破。 |