onedayrexgmail 最近的时间轴更新
onedayrexgmail

onedayrexgmail

V2EX 第 531824 号会员,加入于 2021-02-03 15:11:40 +08:00
今日活跃度排名 23023
onedayrexgmail 最近回复了
首先,你要知道你这个需求的瓶颈在哪,从你的描述中看出来,目前瓶颈在于调用的第三方接口,这些三方接口由于某些原因,可能会导致你的系统堆积,从而导致你的系统受影响,响应慢甚至导致崩溃,这个需求里面,首先第一点你要解决的问题是不要让第三方接口影响到你的系统,前端来调用你使用异步方式去调用三方接口这是一个解决方案,第二点你要解决的就是如何更高效的去调用第三方的接口。这里我说下我的方案,首先,前端调用进来我会去存一张主任务表,一个请求就是一个任务,同时有一张任务明细表,明细表就写的是你调用的 a 、b 、c 接口了,第一次初始化肯定是 a 这个明细能调用,当调用完了 a 再去更新 b 让 b 这条子任务也可调用,这样你的前端调用你时就相当于你只初始化任务数据,其它不管。第二步,写一个定时或者在你前端调用你初始化完成后,做一个通知,把你的任务加到你的执行队列里面去,这里我们先说定时任务,定时任务查询子任务表,哪些任务可以执行,查多少条,这个需要看你的第三方的接口限流情况与你自身带宽情况来定,这个可以做一个配置,发布后根据情况调整,比如每次同时请求的数量先写 50 ,如果三方限制或者带宽限制,调低一些,这个参数需要慢慢调,这里可以写得更详细一些,做三个配置,每一种类型的接口写一个,同时开三个线程池来请求这三类接口,比如 a 接口线程池开 10 个,b 接口线程池开 20 个,具体需要调试,然后请求到结果后把结果写回任务子表中 a ,标识 a 完成,同时把结果写到 b 作为 b 的入参,b 同时标识为可调用,下一次定时任务就会来执行这条 b ,b 里面逻辑同 a ,一直到 c ,c 是一个终止任务,他完成了把 c 自己标识成完成,同时还要标识下主任务完成,但是这里面要注意防止上一次定时任务还没执行完就又到下一论时间再执行,可以写一个锁去做判断,同一时间同种类的定时任务只能有一个,比如执行 a 接口的定时任务,在同一时间只有有一个在执行,其它到时间了来执行都先不执行,这种方式来做,一是你可以对每个接口去动态做调整,二是你可以对中间执行失败的任务再次进行尝试,甚至极端一些有可能需要你手动修改参数的你也可以去调整,三是你们前端还能根据你的状态来查询这个任务具体执行的一个状态。这样既解决了三方接口导致你响应慢的问题,又解决了你能高效的去调用三方的这些接口的问题。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3042 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 13:15 · PVG 21:15 · LAX 05:15 · JFK 08:15
Developed with CodeLauncher
♥ Do have faith in what you're doing.