从上面的简单暴力版本,我们可以发现一个很大的问题

顺序是控制住了,但并发性确极大的降低,如下图

三条不同的流程,流程结束后,产生了三个不同的任务

而这三个任务之间事实上是毫无关系的

而如果按照简单暴力版中给出的方案,

那么,任务2 一定是在任务1 执行完成之后才能执行,而任务3一定是在任务2执行完毕之后才能执行,然而这3个任务之间,却是不需要有执行先后顺序的,他们谁先执行完毕,谁后执行完毕,对应业务的正确性并没有任何影响

所以,简单暴力版的方案,虽然控制住了顺序,却极大的牺牲了并发性能,使得多线程毫无意义

那么,针对这种情况我们怎么解呢?

按照上面的示意图,我们发现,除了之前讲到的“触发消息“这种类型的触发任务,这种表间的触发任务中,毫不相关的任务,其实是不需要顺序的,如果说两个表间类型的任务毫无关系,那么他们是允许并行的

那么问题来了,如何定义"毫不相关"

其实,如果两个触发任务的目标表不相同,我们就可以认为这两个任务"毫无相干"

所以,如果我们按照目标表进行分组,相同目标表的任务放到一个队列里,单个队列中,如果有正在执行的触发任务,那么不允许取出新的任务,而如果当前队列没有正在执行的触发,那么就允许继续取出任务执行

队列示意图如下

当前待解析的队列,会根据任务目标表ID,分别将任务放置到对应的队列中去,

然后触发线程会分别从不同的队列中获取任务,当发现现在正在执行中的任务里,存在和当前正在取的任务目标表ID 相同时,则直接返回,否则,就可以取出来执行具体任务

创建人:yinyanting

快速跳转