V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PHPNewbie
V2EX  ›  PHP

请教一个关于 Laravel 队列的问题

  •  1
     
  •   PHPNewbie · 2017-07-10 17:37:46 +08:00 · 3184 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的情况是这样的:

    有一个外部网站的接口,用户在我的 Laravel 站点查询某些信息时,我的站点会去请求这个外部接口,获得数据后返回给用户。 但这个外部接口不能被同时频繁请求,同时请求会被接口服务器短暂封禁 IP 半个小时,当我的站点有多个用户同时在查询信息时,就容易发生这种情况。

    我想用 Laravel 的队列来处理,用户前台查询信息时,我的站点后台会将这个请求加入队列,依次去请求那个外部 API。

    但 Laravel 队列是异步的,无法将队列中接口请求到的信息即时返回给用户,只能将返回的数据存储起来。

    请问:

    1、Laravel 队列中可以将任务的返回值返回给前台用户吗,如果有,该怎么实现?

    2、对于上述我的需求,是否有更好的实现方式?(或者说,我上述需求是否符合 Laravel 队列的适用场景?如果不适合,有适合的实现方式吗)

    8 条回复    2017-07-11 12:13:26 +08:00
    freehere
        1
    freehere  
       2017-07-10 18:29:58 +08:00
    不合适,加缓存吧,相同的东西多长时间返回相同的信息就好了,具体看你们的业务逻辑了
    ghostheaven
        2
    ghostheaven  
       2017-07-10 18:32:52 +08:00 via Android
    ajax 轮询或者 websocket
    caniuse
        3
    caniuse  
       2017-07-10 19:03:35 +08:00
    用队列是对的,你还需要即时通讯,可以考虑集成环信等免费的即时通讯功能,自己做的话可以用 socket.io 、websocket 来做。
    sfree2005
        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

    结合楼上说的和链接里的 就是完整的解决方案了。
    fuxkcsdn
        5
    fuxkcsdn  
       2017-07-10 20:39:24 +08:00 via iPhone
    上代理😳
    chinafeng
        6
    chinafeng  
       2017-07-10 20:55:12 +08:00
    队列+代理池
    mingyun
        7
    mingyun  
       2017-07-10 23:30:07 +08:00
    查询时给个状态,处理中,处理完成,队列处理完就是完成状态了,可以将数据返回了
    实时的话用 socket 了
    flyingghost
        8
    flyingghost  
       2017-07-11 12:13:26 +08:00
    你面临的是两个问题:
    1,client 访问速度和 server 查询速度的冲突。异步或者缓存可破。
    2,异步查到结果后如何告知的问题。轮询或者 socket 主动推可破。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5445 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:28 · PVG 16:28 · LAX 00:28 · JFK 03:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.