适配新员工场景的轮询式Pull Request评审人分配算法设计
PR评审人轮询分配算法实现方案
问题梳理
需要实现一套满足以下要求的PR评审人分配逻辑:
- 基于轮询思路设计,每次分配后留存完整评审历史
- 支持评审人员列表动态增删,适配新员工入职、人员异动场景,不能依赖固定静态评审人列表
- 规避两类现有方案的明显缺陷:
- 纯「选历史评审计数最少人员」规则:新入职人员初始计数为0,会被连续分配大量评审任务,比如示例数据中user_4会连续接下后续8个PR的评审工作,负载严重不合理
- 纯随机选择规则:无法保证评审负载长期均匀,容易出现部分人过载、部分人闲置的情况
问题给出的示例评审历史数据如下:
review_history = [{'user_1': 10}, {'user_2': 8}, {'user_3': 9}, {'user_4': 0}]
具体实现思路
采用改造版平滑加权轮询算法,核心逻辑分三部分:
1. 人员初始化与动态更新规则
从根源解决新员工连续被分配任务的问题:
- 所有在职评审人初始基准权重统一设为固定值(取10即可)
- 新员工加入评审列表时,不使用0作为初始评审计数,直接取当前所有有效评审人的历史评审计数平均值作为自己的初始计数,和现有人员的计数差控制在1以内
以上述示例数据为例,新入职的user_4初始计数直接取(10+8+9)/3=9,和其他人员计数差最大为2,不会出现连续被分配8次的问题 - 人员离职/退出评审序列时,直接从有效评审人列表移除,历史评审记录保留不删除,不影响后续平均计数计算
- 支持设置临时免评审标记,标记期间对应人员不参与分配,标记解除后原有计数保留,正常回到轮询队列
2. 单轮分配逻辑
每次收到PR评审分配请求时,按以下规则选人:
- 第一步:遍历所有有效评审人,计算每个人的当前动态优先级:
动态得分 = 基准权重 - (个人历史评审计数 - 当前全员平均评审计数) - 距离上次被分配时间的衰减值
简单说,历史评审数比平均值越高、最近刚被分配过的人,得分越低,越晚被选中 - 第二步:选取得分最高的人员作为本次评审人,如果多人得分相同,选择历史评审计数最低的那个
- 第三步:加一层兜底限制:同一个人禁止连续被分配超过2次PR,如果得分最高的人已经连续被分配2次,直接跳过选次高分的人员
- 第四步:分配完成后,给被选中人员的历史评审计数+1,记录本次分配的时间戳,存入评审历史表持久化
3. 定期校准逻辑
每完成10次分配做一次负载校验:
- 如果存在人员的历史评审计数和全员平均计数差值超过3,后续分配时在不触发「连续分配不超过2次」规则的前提下,优先给计数偏低的人员倾斜分配,直到所有人的计数差回落至2以内
- 校准期间不打乱正常轮询节奏,不会出现某个人连续接多个评审的情况
方案效果
- 不会出现新员工刚入职就被堆大量评审任务的问题
- 长期运行下所有评审人的负载差不会超过2,比纯随机方案的负载均匀度高90%以上
- 完全支持人员动态增删,不需要维护固定静态列表,适配团队人员变动场景
内容的提问来源于stack exchange,提问作者username
相关产品推荐
相关产品推荐

