关于队列使用的思考

写在前面:

     今天不写代码,分享一下关于队列的思考。高并发在我们的工作当中是一个经常遇到的问题,一般数据库性能依赖于硬件,自身并没有对并发进行控制,更多的时候我们需要从程序设计的角度控制并发,根据服务器的性能来控制并发量。如果压力过载,轻则运行如龟速,重则程序崩溃。

    下面有这样一个场景,有一堆待执行的任务A、B、C、D……X、Y、Z,A`、B`、C`、D`……X`、Y`、Z`,共计52个任务。服务器最多允许10个并发,且A执行的过程中,A`不能同时执行,且这些任务执行顺序是随机的,并不一定是按照ABCD的方式顺序来执行,那么此时这一堆任务应该如何执行下去呢?

思路分析:

    1、首先,任务最开始执行,肯定是不需要排队的。

    2、对于任务的执行状态,我们程序是可以检测到的,找个地方暂存一下或者有直接监测的方式更好。

    2、当执行中的任务数量到达10个的时候,此时需要排队。

    3、需要排队我们就把待执行的任务放到队列Q1中去(此处我们使用redis队列)。

    4、那么问题来了,A和A`互斥,比如说10个执行中的任务中有A任务,A`作为第11个待执行任务,那么当B任务执行完,执行中的任务还剩9个,此时,A还没执行完,那么显然不能让A`执行的。

    5、关于A和A`这种互斥的任务,我们可以放到另外一个队列中去。

    6、此时至少需要两个队列,第二个队列我们叫它Q2。

闲言少叙,上个图:

后续思考:

    1、Q1和Q2两个队列有可能同时监测到执行器中任务数量小于10,导致执行器中数量超过10。可以通过优先级控制的方式来解决,或者通过设置不同的监测周期来解决此问题。

    2、当执行器中断,任务状态也应该清零。不然会导致队列机制错乱,故每一次程序启动时,现将所有任务的执行状态清零,从零开始。

写在最后:

    此种方式还未完全实践,后续实践后分享出来。如果大家有什么更好的办法,欢迎留言,大家一起探讨。

猜你喜欢

转载自blog.csdn.net/zwq_zwq_zwq/article/details/80964260