请教一个后端/后台的设计思路.
① 问题场景:
一个新用户注册后, 会有一个任务开始执行, 每个用户都有自己对应单独的一个任务.这个任务是24*7一直在实时运行监控的(计算任务/Http请求/耗时任务).
(有点类似携程app高铁票抢票的意思.)
② 我的思路:
一开始想的是一个新用户进来就新开一条线程. 或者管理一个线程池, 把任务全都放进一个队列中.循环的在线程池进行任务的计算. 但是中途会有新用户(任务)进来. 而且这样如果用户量一多的话好像想过不是很理性.
也就是线程池每批进行n个任务的运行. 但是这样所有用户一轮下来时间好像有点长.
③ 向大佬请教:
我也挺小白的, 所以想问一下具体这种场景比较推荐怎么样的实现方式/思路. 困扰了我好久.**感谢大佬.!**
回答:
建立任务池,多个任务节点监控任务池,一旦有任务进入任务池就自动领任务
定时任务创建程序定时将任务扔入任务池
用户注册成功之后加入定时任务里
任务创建-->任务池-->任务节点运行任务
回答:
单机的就不说了。数据量大了,肯定要用分布式。下面说下分布式的思想(假设有 n 个任务节点):
可以通过一致性 hash 的方式去分配任务,用 zookeeper 做任务注册,管理中心。有新用户注册,就向数据库写一条任务数据,并向 zookeeper 注册任务 id。节点通过 zookeeper 去获取任务 id,然后去数据库查询相应任务数据,并运行。
或者简单点,任务节点直接去数据库取模 jobId % n 获取任务,jobId 为任务的自增 id。只不过这样的话,相比一致性 hash,当增加/减少节点时,任务的重新分配会比较麻烦。
回答:
我很好奇为什么每个用户都要有一个任务进程?如果用户数很大,这是不可能实现的。
高铁抢票那种任务并不一定是每个用户都跑一个任务执行,可以跑一个抢票的任务然后所有用户执行。
回答:
也就是线程池每批进行n个任务的运行. 但是这样所有用户一轮下来时间好像有点长.
如果量大了的话,你讲的这个情况是避免不了的。所以楼上也有提到可以考虑分布式,其实这个问题也就变成了“怎么把任务分发到不同的机器去执行”。
以上是 请教一个后端/后台的设计思路. 的全部内容, 来源链接: utcz.com/p/167773.html