Contention Profile
A Contention Profile is a reusable policy that throttles how the
Dispatcher releases Tasks onto a Platform. Profiles are created once and
linked to one or more Platforms; the Dispatcher checks every linked profile
when deciding whether to claim a queued Task.
Editor overview
The editor has two tabs:
- General — name, type, scope, and enabled flag. The type is locked
after first save and cannot be changed.
- Settings — type-specific attribute values. This tab is only available
once a type has been selected.
Fields
| Field |
Description |
| Name |
Display name for the profile. |
| Type |
Contention strategy — Concurrency or Rate Limit. Locked after creation. |
| Scope |
Per Platform (default) or Global — see below. |
| Enabled |
When unchecked the profile is ignored by the Dispatcher even if linked. |
Profile types
- Concurrency Contention — caps the number of Tasks that can run at the
same time. Configurable attributes:
- Max Concurrent Tasks (required).
- Queue Size Limit (optional) — how many runs can wait.
- Queue Timeout Seconds (optional) — drop or fail waits older than this.
- Exceed Action — what to do when full (Queue / Reject / DeferToNextWindow).
- Rate Limit Contention — caps dispatches per rolling window.
Configurable attributes:
- Algorithm — Token Bucket (allows bursts) or Leaky Bucket (smooths).
- Limit and Window Seconds (required).
- Bucket / refill / leak tuning attributes (optional).
Scope
- Per Platform (default, recommended) — the profile maintains an
independent counter per linked Platform.
- Global — every linked Platform shares one counter. Use only when the
linked platforms share a downstream bottleneck (e.g., the same database).
Linking and composition
A Profile takes effect after you link it to one or more Platforms. A Task
must satisfy every profile linked to its Platform — limits compose. The
Dispatcher picks up profile changes immediately; no restart is needed.
Disabling a profile (setting Enabled to false) is the safest way to
temporarily lift a limit without deleting the profile or unlinking it from
Platforms.
Best practices
- Start with Per Platform scope. Switch to Global only if you measure a
shared bottleneck.
- Use Concurrency to protect downstream services with a fixed thread pool;
use Rate Limit to satisfy provider quotas.
- Combine both — a Concurrency profile to cap simultaneous runs and a
Rate Limit to smooth bursts is a common, safe baseline.
- Disable a profile rather than deleting it when load-testing, so the
Platform links are preserved.