#20295·druid

HttpRemoteTaskRunner: Overlord 因大量积压任务而停滞

作者: Anubhav-Roy创建于 2026年9月8日更新于 2026年9月8日
标签Feature/Change Description

说明

HttpRemoteTaskrunner. ExpecutionLoop ()'在重复待决任务'的同时,拥有单一的状态Lock ' 监测器,对于**它称为FindWorkerTorunTask (Task)'的每一项待决任务,它重建了对所有工人的完整而不可改变的快照:

贾瓦 // 找到工人拖放任务( 任务) 返回策略。 find Worker ForTask () 配置 ImmultableMap.copyOf( 获得工作资格的TounTasks ()), // 在每个呼叫中重建 任务 (三)


`获得工人资格的TounTasks()'过滤和改变整个`工人'地图,以及每个`工人Holder.toImmutable()'`重建工人通过`ImmutableWorkerInfo. from Worker Announts(.)'宣布的任务'。

O( 待定任务 × 工人 × 任务 )


.整个通行证是在持有`地位锁'时执行的。

在小的积压中,这是无形的。 在组群处于/接近容量的大批待处理积压下,单个循环通道将 " statusLock " 维持多秒至几分钟。 " 运行() " (提交新任务)、 " 任务完成() " / 状态更新以及工人同步路径也要求 " 地位锁 " ,因此 " 霸主 " 实际上冻结了。

重启"霸主"无法恢复:激活的任务集在元数据中被坚持,并在启动时通过"SyncFromStorage"重新加载,因此"TydTasids"立即又大了,而循环重新进入相同的锁控扫描.

央视德鲁伊33.0.0 ("httpRemote"任务跑道).

摊位上的线索- 弹出签名 :
- 一个`待决任务-管理者-`线条'是`Runable',持有`StatusLock',深入`Info. from Worker Announts ' -`Worker Holder.to Immunable'-`Geters Captainable ToRunTasks'-`Find Worker ToRunTask'-`ExtecutionLop'。
- 其他待决任务执行线程被闲置在“statusLock.wait()”中。
- 在`HttpRemoteTaskrunner.run ()'的同一显示器上,`任务-管理者'是`BLOCKED',同时持有`任务-管理者'大锁。
- 许多Jetty `qtp-*`- 处理器线条停放在`GovernordResources.taskPost-Task queue.add ' 上的`任务队列 ' 锁上。

动机

** 使用案件:** 使用“httpremote”任务执行者的任何管理者,在工人饱和时可累积大量待处理任务积压

** 改变为何有益:**
- 正确性不改变行为:在一个单一的同步内,最多一个任务(在`With Unaccessd Task.putIfAbsent ' 之后`break')通过循环储备,因此,合格工人的组合在内部循环之间变化无常——每任务重算它产生相同的结果。

** 建议的固定办法:**

** 计算合格工人每通过一次快照**,而不是每待完成一次任务。 在使用`待决任务'之前在`同步(状态Lock)'内建造,并传入超载的`find Worker ToRunTask(任务,ImmtableMap<String,ImmtableWorkerInfo>合格工人)'。 这样一来,从O(待决任务×工人×任务)到O(工人×任务×工人)每次通行证的重建费用就降到了O(工人×任务).

缩写 :

贾瓦
. . . . . . .