比如说一个很长的队列,进入队列之后我们可以提示用户已经进入队列,但是处理完了之后,服务器怎么通知到对应的客户端呢?因为一直以来都是客户端向服务器发请求,服务器端是无法主动向客户端发起请求的吧?
怎么感觉队列有点像是将多线程转换成了单线程呢?
1
rogeecn 2016-01-12 12:27:52 +08:00
客户端轮询 OR WEBSOCKET
|
2
soundofsilence 2016-01-12 12:40:32 +08:00
队列就得是单线程啊, 至少从外部看起来是串行的.
|
3
Tinet 2016-01-12 12:49:32 +08:00
RPC
|
4
kimmykuang 2016-01-12 13:02:50 +08:00 via Android
有很多时候必须把多进程的事情放到单线程里去做,比如抢票,否则并发抢票太难处理了,最起码我们是用的这个模型。
|
5
sun2920989 2016-01-12 13:03:12 +08:00
回调或者等着客户端查状态
|
6
kimmykuang 2016-01-12 13:03:53 +08:00 via Android
至于怎么通知前端,这个是另一个问题,与对接本身无关,应该去看消费者怎么消费队列里的数据
|
7
zbz 2016-01-12 13:09:36 +08:00
轮训,或者 comet
|
8
ben548 OP 谢谢各位,有了大概的思路了
|
9
yougg 2016-01-12 14:09:29 +08:00
要么回调, 要么轮询。
|
10
roys 2016-01-12 14:25:18 +08:00
要看什么需求啊, lz 的需求是?
|
11
pynix 2016-01-12 15:40:45 +08:00
可以在任务完成后将运行结果写回。
|
12
moka20477 2016-01-12 16:42:54 +08:00
回调是最简单的方式
|
13
MiskoLee 2016-01-12 22:38:32 +08:00
通常的,有两种通用的可选的解决方案。
一,任务执行完毕之后,由任务服务发起 notify 。通常的是使用 HTTP POST 的方式传递任务标识以及状态。用于 notify 的 URL 怎么传递,不在本问题范畴内。我们可以任务入队列的时候传递,也可以由任务服务统一配置。 二,任务成功压入队列之后,向任务提交方返回任务 id 。任务服务提供 query 接口来查询某个任务 id 的状态。 事实上,我们在实现队列服务的时候,两者可以一起实现,并不冲突。 在真实的实现时候,还会有更多的问题需要考虑。 1. notify 失败怎么办,是跳过还是重新 notify 一次? 2. 是否有可能 notify 成功了,但是 query 却还无法查询到数据? |