PageSourceSearch

http://ibeetl.com/assets/index.html-CnEDC1FB.js

js ibeetl.com collected 2026-10-03 23:20:11 UTC 40,386 bytes, 79 lines download raw bytes

1import{_ as s,c as a,b as n,o as l}from"./app-CNefOTx1.js";const e="/assets/request_prioirty--rZLUui0.png",h={};function t(k,i){return l(),a("div",null,i[0]||(i[0]=[n('<p>业务系统中,针对多种业务请求,期望高优先级的任务尽响应客户端,低优先级的任务在没有高优先级任务情况下可以充分得到执行,有高优先级任务情况下偶尔执行或者不执行。这种场景有</p><ul><li>物联网系统:设备上下线的任务处理优先级高,其次是设备故障告警事件优先级高,而设备属性上报优先级低</li><li>电商系统,支付业务是核心业务,需要高优先级执行;电商中请求标记为VIP的用户,需要优先得到系统的服务</li><li>金融系统中,风控系统是核心业务,需要高优先级执行;金融系统功能中,低频的大额资金业务比高频的小金额业务更优先执行。</li></ul><p>实现请求的优先级处理,通常有如下步骤</p><ul><li>标记任务为优先级,如物联网设备上线业务的优先级高于属性上报优先级</li><li>为不同优先级的请求分配不同的资源处理,如果是分布式系统,可以通过代理(api网关),或者微服务框架,消息中间件等,派发不同优先级任务到不同的服务集群。如果是单体系统,高优先级任务应该得到线程优先执行。</li></ul><p>下图是在分布式系统中,采用消息中间件Kafka派发不同优先级任务到不同的Topic以实现优先级处理</p><p><img src="'+e+`" alt=""></p><p>Producer根据业务类型,派发不同功能优先级的业务到Topic里,如上图建立了俩个Topic,一个是高优先级,一个是低优先级。每个Topic都配置不同的Consumer集群 进行处理。比如大额交易放入高优先级队列,此时尽管对应的Consumer部署较少节点,但因为大额交易请求数量较少,能得到优先执行。 小额交易进入低优先级Topic,然后派发到低优先级Consumer集群处理。</p><p>Kafka使用了多个Topic实现优先级,RabbitMQ,Apache ActiveMQ以及商业消息中间件支持 <code>优先级队列</code>,使用一个队列,其能对消息进行排序,供消费者按照优先级处理。</p><p>单体系统中,也可以通过使用多个线程池实现优先级处理。比如设定设备上下线有一个线程池,其他业务用另外一个线程池</p><div class="language-plain line-numbers-mode" data-ext="plain" data-title="plain"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>ThreadPoolExecutor onlineEventPool =  ...</span></span>
2<span class="line"><span>ThreadPoolExecutor warnningEvnentPool =  ...</span></span>
3<span class="line"><span>ThreadPoolExecutor nomalEventPool =  ...</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>分布式下使用多个集群,或者单体系统使用多个线程池,除了简单快速实现优先级处理外,还有个优势是能“物理隔离”优先级任务到不同环境执行。比如上图Kafka实现优先级任务处理,单独维护低优先级Consumer,不影响高优先级Consumer的执行。</p><p>但这种方式在特定场景下有俩个缺点需要解决:</p><ul><li>为不同优先级创建不同的集群资源或者线程池,但如果设定优先级较多,需要每一个优先级创建一个集群资源或者线程池。</li><li>即使较少优先级设定对应了较少的集群资源或者线程池,也可能造成资源浪费,比如专门处理高优先级的集群资源长期处于不繁忙状态,不利于降本增效。</li></ul><p>解决方案是只创建一个集群或者一个线程池,通过一个“派发器” ,将高优先级任务优先转发到唯一的一个集群或者线程池,低优先级先暂时存放到一个队列等待派发。</p><p>单体系统最简单方法是使用<code>PriorityBlockingQueue</code> 构造<code>ThreadPoolExecutor</code>,<code>PriorityBlockingQueue</code> 在构造时候要求实现<code>Comparator</code>以计算优先级,<code>Comparator::compare</code> 返回数值大于0将排在队列前优先执行,小于0将延后执行</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> PriorityBlockingQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> initialCapacity</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span></span>
4<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                             Comparator</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">&lt;</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">?</span><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">
4 super</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> E</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">&gt;</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> comparator</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>需要注意的是,如果高优先级任务总是得到优先处理,会导致低优先级任务没有机会执行(需要结合实际业务考虑是否会发生这种情况,比如大多数高优先级任务个数是低于普通优先级的,不太可能存在此情况),因此队列的优先级通常不是直接根据业务优先级计算而得,而是综合了业务优先级和在队列等待时间计算,如果低优先级的任务在队列等待时间较长,其优先级提升,比如<code>DelegateTask</code>的getPriority,用于动态计算在队列中的优先级,当等待时间超过500毫秒,优先级得到提高。</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> DelegateTask</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> implements</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Runnable</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
5<span class="line"></span>
6<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    private</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> final</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> priority</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
7<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    private</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> final</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Runnable</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> delegate</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
8<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> final</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> long</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> enqueueTs</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
9<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    /** 老化系数:每等待多少毫秒,+1老化分数;数值越大老化越慢 */</span></span>
10<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    private</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> static</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> final</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> long</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> AGING_UNIT_MS</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 500</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
11<span class="line"></span>
12<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> DelegateTask</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> priority</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Runnable </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">delegate</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
13<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">        this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">priority</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> priority</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
14<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">        this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">delegate</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> delegate</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
15<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">        this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">enqueueTs</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> System</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">currentTimeMillis</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
16<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
17<span class="line"></span>
18<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    /**</span></span>
19<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">
19     * 计算队列中的动态优先级,PriorityBlockingQueue的Comparator类,将使用getPriority 用于计算优先级</span></span>
20<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">     */</span></span>
21<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> int</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> getPriority</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
22<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        long</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> waitMs</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> System</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">currentTimeMillis</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> -</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> enqueueTs</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
23<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> agingScore</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> (</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> (</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">waitMs </span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">/</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> AGING_UNIT_MS</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
24<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        return</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> priority </span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">+</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> agingScore</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
25<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
26<span class="line"></span>
27<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    @</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Override</span></span>
28<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> run</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
29<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">        delegate</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">run</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
30<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
31<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>另外一个方法是实现MultipleQueue,作为参数传入线程池,MultipleQueue内部包含了多个BlockingQueue,代表不同的优先级。当ThreadPoolExecutor 调用 MultipleQueue::poll 取出一个等待执行任务时候,offer方法需调用Policy类来决定返回一个任务</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> MultipleQueue</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">  implements</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Queue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
32<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    BlockingQueue</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
33<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    BlockingQueue</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
34<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    Policy</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> policy</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
35<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> MultipleQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">BlockingQueue </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">BlockingQueue </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">Policy </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">policy</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
36<span class="line"></span>
37<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
38<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    //线程次内部将调用poll方法获取任务,这里重新实现,通过policy决定返回哪个队列的任务</span></span>
39<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    @</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">
39Override</span></span>
40<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Object </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
41<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> policy</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">get</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
42<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
43<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>MultipleQueue 维护多个队列,每个队列代表了一个优先级。当<code>ThreadPoolExecutor</code>调用poll方法获取一个可执行的任务时候,Policy来决定返回哪个队列的的任务,如下类<code>AlwayHightPolicy</code>总是优先返回高优先级任务</p><div class="language-typescript line-numbers-mode" data-ext="typescript" data-title="typescript"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> AlwayHightPolicy</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> implements</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Policy</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
43{</span></span>
44<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    @</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">Override</span></span>
45<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> Object</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> get</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">high</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">nomal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
46<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">        //总是优先执行高优先级任务</span></span>
47<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        if</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">!</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">high</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">isEmpty</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()){</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> high</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();}</span></span>
48<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> nomal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
49<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
50<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>可以引入计数器,实现权重,当从高优先级队列中获取4个任务时候,可以从低优先级队列获取一个任务,当没有高优先级任务时候,总是取出低优先级任务。</p><div class="language-typescript line-numbers-mode" data-ext="typescript" data-title="typescript"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> WeightPolicy</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> implements</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Policy</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
50{</span></span>
51<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">    int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> highCount</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">0</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
52<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">    int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> weight</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">4</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
53<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    @</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">Override</span></span>
54<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> Object</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> get</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
55<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        if</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highCount</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">%</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">weight</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">!=</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">weight</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)){</span></span>
56<span class="line"><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">            getHight</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
57<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
58<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        return</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> getNormal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
59<span class="line"></span>
60<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
61<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    //获取高优先级队列任务</span></span>
62<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    protected</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> Object</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> getHight</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
63<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        if</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">!</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">isEmpty</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()){</span></span>
64<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">            highCount</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">++</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
65<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">            return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
66<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">else</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
66{</span></span>
67<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">            return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
68<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
69<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
70<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    //获取低优先级任务</span></span>
71<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    protected</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> Object</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> getNormal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> BlockingQueue</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">&lt;?&gt; </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
72<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        if</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">!</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">isEmpty</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()){</span></span>
73<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">            return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> normalQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
74<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">else</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
74{</span></span>
75<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">            highCount</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">++</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
76<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">            return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> highQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">poll</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
77<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
78<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
79<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>MultipleQueue 可以扩展支持多个队列,每个队列代表了不同优先级。参考本书附带的例子。</p>`,25)]))}const r=s(h,[["render",t],["__file","index.html.vue"]]),d=JSON.parse('{"path":"/article/performance/policy_requestpriority/","title":"性能优化-请求优先级","lang":"en-US","frontmatter":{"title":"性能优化-请求优先级","tags":["性能","新书"],"createTime":"2026/08/24 12:36:15","permalink":"/article/performance/policy_requestpriority/","description":"业务系统中,针对多种业务请求,期望高优先级的任务尽响应客户端,低优先级的任务在没有高优先级任务情况下可以充分得到执行,有高优先级任务情况下偶尔执行或者不执行。这种场景有 物联网系统:设备上下线的任务处理优先级高,其次是设备故障告警事件优先级高,而设备属性上报优先级低 电商系统,支付业务是核心业务,需要高优先级执行;电商中请求标记为VIP的用户,需要优先...","head":[["meta",{"property":"og:url","content":"http://ibeetl.com/article/performance/policy_requestpriority/"}],["meta",{"property":"og:site_name","content":"闲大赋"}],["meta",{"property":"og:title","content":"性能优化-请求优先级"}],["meta",{"property":"og:description","content":"业务系统中,针对多种业务请求,期望高优先级的任务尽响应客户端,低优先级的任务在没有高优先级任务情况下可以充分得到执行,有高优先级任务情况下偶尔执行或者不执行。这种场景有 物联网系统:设备上下线的任务处理优先级高,其次是设备故障告警事件优先级高,而设备属性上报优先级低 电商系统,支付业务是核心业务,需要高优先级执行;电商中请求标记为VIP的用户,需要优先..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2026-08-24T05:21:51.000Z"}],["meta",{"property":"article:tag","content":"性能"}],["meta",{"property":"article:tag","content":"新书"}],["meta",{"property":"article:modified_time","content":"2026-08-24T05:21:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"性能优化-请求优先级\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"202
796-08-24T05:21:51.000Z\\",\\"author\\":[]}"]]},"headers":[],"readingTime":{"minutes":5.85,"words":1754},"git":{"updatedTime":1787548911000,"contributors":[{"name":"lijiazhi","username":"lijiazhi","email":"[email protected]","commits":1,"avatar":"https://gravatar.com/avatar/1b5114831459724ad4acc394423b4b48ecfa4a7e0659fbe07a0ce5181a1050a7?d=retro"}]},"autoDesc":true,"filePathRelative":"article/性能/request_priority.md","categoryList":[{"id":"92a2b5","sort":10000,"name":"article"},{"id":"afdb50","sort":10004,"name":"性能"}]}');export{r as comp,d as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.