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

如果实现了队列,怎么在队列处理完成之后通知用户结果呢?

  •  
  •   ben548 · 2016-01-12 11:25:26 +08:00 · 3876 次点击
    这是一个创建于 3256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说一个很长的队列,进入队列之后我们可以提示用户已经进入队列,但是处理完了之后,服务器怎么通知到对应的客户端呢?因为一直以来都是客户端向服务器发请求,服务器端是无法主动向客户端发起请求的吧?
    怎么感觉队列有点像是将多线程转换成了单线程呢?

    13 条回复    2016-01-12 22:38:32 +08:00
    rogeecn
        1
    rogeecn  
       2016-01-12 12:27:52 +08:00
    客户端轮询 OR WEBSOCKET
    soundofsilence
        2
    soundofsilence  
       2016-01-12 12:40:32 +08:00
    队列就得是单线程啊, 至少从外部看起来是串行的.
    Tinet
        3
    Tinet  
       2016-01-12 12:49:32 +08:00
    RPC
    kimmykuang
        4
    kimmykuang  
       2016-01-12 13:02:50 +08:00 via Android
    有很多时候必须把多进程的事情放到单线程里去做,比如抢票,否则并发抢票太难处理了,最起码我们是用的这个模型。
    sun2920989
        5
    sun2920989  
       2016-01-12 13:03:12 +08:00
    回调或者等着客户端查状态
    kimmykuang
        6
    kimmykuang  
       2016-01-12 13:03:53 +08:00 via Android
    至于怎么通知前端,这个是另一个问题,与对接本身无关,应该去看消费者怎么消费队列里的数据
    zbz
        7
    zbz  
       2016-01-12 13:09:36 +08:00
    轮训,或者 comet
    ben548
        8
    ben548  
    OP
       2016-01-12 13:30:34 +08:00
    谢谢各位,有了大概的思路了
    yougg
        9
    yougg  
       2016-01-12 14:09:29 +08:00
    要么回调, 要么轮询。
    roys
        10
    roys  
       2016-01-12 14:25:18 +08:00
    要看什么需求啊, lz 的需求是?
    pynix
        11
    pynix  
       2016-01-12 15:40:45 +08:00
    可以在任务完成后将运行结果写回。
    moka20477
        12
    moka20477  
       2016-01-12 16:42:54 +08:00
    回调是最简单的方式
    MiskoLee
        13
    MiskoLee  
       2016-01-12 22:38:32 +08:00
    通常的,有两种通用的可选的解决方案。
    一,任务执行完毕之后,由任务服务发起 notify 。通常的是使用 HTTP POST 的方式传递任务标识以及状态。用于 notify 的 URL 怎么传递,不在本问题范畴内。我们可以任务入队列的时候传递,也可以由任务服务统一配置。

    二,任务成功压入队列之后,向任务提交方返回任务 id 。任务服务提供 query 接口来查询某个任务 id 的状态。

    事实上,我们在实现队列服务的时候,两者可以一起实现,并不冲突。

    在真实的实现时候,还会有更多的问题需要考虑。
    1. notify 失败怎么办,是跳过还是重新 notify 一次?
    2. 是否有可能 notify 成功了,但是 query 却还无法查询到数据?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5302 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:19 · PVG 11:19 · LAX 19:19 · JFK 22:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.