Skip to content

優先度、公平性、Backpressure

この記事は英語版から翻訳されました。最新版は英語版をご覧ください。

ジョブシステムが共有基盤になると、スケジューリングポリシーはプロダクト機能になります。公平性がなければ1つのテナントやジョブ種別が全員をstarveさせます。backpressureがなければ、一時的な依存先遅延が巨大な遅延債務になります。優先度は有用ですが、quotaなしの優先度はDoSの仕組みになります。

スケジューリング問題

workerは有限です。jobは等価ではありません。

  • user-visibleなjob
  • batch maintenance
  • 有料tenantの強いSLA
  • strict quotaを持つdownstream
  • fresh workより後ろに回すべきretry

スケジューラは希少なexecution slotを誰に渡すかを決めます。

Priorityだけでは足りない

tenant Aがhigh-priority jobを出し続けると他がstarveします。priorityにはfairnessまたはadmission controlが必要です。

ポリシー

Policy仕組みリスク
FIFO古いjobから実行bulk workがurgent workを塞ぐ
Strict priority最高priorityから実行starvation
Weighted fair queueingclassごとにshareを持つscheduler complexity
Deficit round robinjob costに応じcredit消費cost estimateが必要
Earliest deadline first近いdeadlineから実行見積もり誤りでthrashing

Tenant Fairness

text
effective_score =
  priority_weight
  + age_boost
  - tenant_over_budget_penalty
  - downstream_pressure_penalty

公平性は「全員同じthroughput」ではなく、「誰も無制限に共有capacityを消費できない」ことです。

Aging

text
age_boost = min(max_boost, floor(wait_seconds / aging_interval) * boost_step)

agingは低priority jobが永久に待つことを防ぎます。

Backpressure Signals

SignalProducer response
queue ageがSLO超過background workを減速/拒否
downstream 429増加integration concurrency削減
DB latency spikeDB-heavy jobをpause
worker error spikeretry amplification停止
tenant quota超過deferまたはreject

backpressureはworkerだけでなくenqueue側に効かせます。

Admission Control

ユーザー向け操作では、数時間後に完了するjobを受け付けるより早く拒否する方が正しいことがあります。

障害モード

障害症状対策
starvation古い低priority jobが実行されないagingとminimum share
priority inversion低priority jobが希少依存先を占有dependency別concurrency pool
retry amplificationfailed jobがworkerを支配retry queueを低priorityにする
noisy tenant1 tenantがqueueを埋めるtenant quota
scheduler hot looprunnableでないjobをscanし続けるrunnable time/classでpartition

関連パターン

MITライセンスの下で公開。Babushkaiコミュニティが構築。