Start here. This is the direct spoken answer to practice first.
Why this question matters
A service can overwhelm a dependency long before it exhausts its own CPU. Bounded concurrency, rate-limit signals, retry budgets, and queues keep downstream pressure predictable when item counts or latency rise.
I avoid starting one external call per item without a limit. A small in-process workflow can use SemaphoreSlim or Parallel.ForEachAsync with a configured degree of parallelism, while a larger workflow is usually better behind a bounded queue and worker pool. Every call receives cancellation and a timeout, and transient retries stay within a fixed attempt and time budget. The limit starts from the provider's quota and the capacity my service can safely devote to that dependency.