Distributed Workflow Orchestration Platform  ·  View 07 of 31  ·  Structure

Messaging Topology & Queue Classes

Which queues exist, why there are several, and how a failed message reaches a human.

Editable source SVG draw.io All views
Service Bus Premium — shared namespace (sb-wfo-prod)
Service Bus Premium — shared namespace (sb-wfo-prod)
Work distribution — one queue per priority class
Work distribution — one queue per priority class
tasks-high
lock 5 min · prefetch 8
tasks-high...
tasks-standard
lock 5 min · prefetch 32
tasks-standard...
tasks-bulk
lock 5 min · prefetch 64
tasks-bulk...
tasks-longrunning
sessions · renew to 2 h
tasks-longrunning...
Control and results
Control and results
task-completions
sessions on executionId
task-completions...
workflow-control
cancel · pause · resume
workflow-control...
scheduled-retries
native scheduled messages
scheduled-retries...
Failure handling
Failure handling
Native DLQ (per queue)
maxDelivery 10 · TTL expiry
Native DLQ (per queue)...
dlq-drain
moves to Cosmos store
dlq-drain...
Poison quarantine
unparseable messages
Poison quarantine...
Dedicated namespace — tier-1 tenant escape hatch
Dedicated namespace — tier-1 tenant escape hatch
sb-wfo-tenant-a
sb-wfo-tenant-a
tasks-tenant-a
noisy-neighbour isolation
tasks-tenant-a...
completions-tenant-a
completions-tenant-a
Trigger ingress
Trigger ingress
Azure Event Grid
Azure Event Grid
Custom topic
CloudEvents 1.0
Custom topic...
Subscription filters
eventType + tenantId
Subscription filters...
Event Grid DLQ
Blob container
Event Grid DLQ...
Outbox Relay
Outbox Relay
Worker pools
Worker pools
Orchestration Service
Orchestration Service
Dead-letter store
Cosmos container
Dead-letter store...
dispatch
dispatch
peek-lock
peek-lock
result
result
advance
advance
drain loop
drain loop
enriched record
enriched record
start execution
start execution
Messaging Topology & Queue Classes
Messaging Topology & Queue Classes
Queue / topic
Queue / topic
Application we own
Application we own
Risk / gap
Risk / gap
Interface / broker
Interface / broker
Data store
Data store
event / async
event / async
failure / alternate
failure / alternate
synchronous
synchronous
Service Bus has no message priority, so priority is expressed as separate queues with separate worker deployments and separate KEDA bounds. Sessions are used only where ordering is genuinely required.
Service Bus has no message priority, so priority is expressed as separate queues with separate worker deployments and separate KEDA bounds. Sessions are used only where ordering is genuinely required.
v 1.0 · owner Data & AI Global Practice · date 2026-08
v 1.0 · owner Data & AI Global Practice · date 2026-08
Text is not SVG - cannot display

Decisions

  • Service Bus has no message priority, so priority is separate queues with separate worker deployments and separate KEDA bounds. A single queue with a priority property would still be drained in arrival order and would deliver nothing.
  • Sessions are used only on the completions queue and the long-running task queue. Sessions serialise processing per session id, which is exactly right for ordering completions within one execution and exactly wrong for the general task queue.
  • Two dead-letter sources, one destination. Native dead-letters are infrastructure problems and application dead-letters are business problems, but an operator should never have to know which console to open, so dlq-drain merges both into one Cosmos-backed store.

Settings that matter

  • Lock duration 5 minutes with client-side auto-renewal to 2 hours for the long-running class. maxDeliveryCount is 10 as an infrastructure backstop; application retries never reach it because they are re-enqueued as new scheduled messages (view 19).
  • Prefetch is tuned per class — 8 for high priority, 32 standard, 64 bulk — because prefetch is the hidden concurrency limit that makes a fair-looking system unfair under load.
  • MessageId is set to the taskExecutionId with a 10-minute duplicate detection window, which suppresses relay-level double dispatch without pretending to give exactly-once.

Risks

  • A dedicated namespace per tier-1 tenant does not scale past a handful of tenants; namespace count and cost grow linearly. It is an escape hatch sold as a premium tier, not the isolation model (view 29).
  • Scheduled messages accumulate against the namespace quota. A tenant with a 5-minute maximum backoff and a failing downstream can hold tens of thousands of scheduled messages, which needs a monitor.
  • Event Grid dead-letters land in Blob and are not currently merged into the operator view. That is a known gap for V1.1.