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

2016-01-12 11:25:26 +08:00
 ben548

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

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

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

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

在真实的实现时候,还会有更多的问题需要考虑。
1. notify 失败怎么办,是跳过还是重新 notify 一次?
2. 是否有可能 notify 成功了,但是 query 却还无法查询到数据?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/250092

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX