Logic Apps Standard: single HTTP action (retryPolicy none) aborts its call and re-executes on a different worker

Krista Scerri 40 Reputation points
2026-11-04T08:56:11.4533333+00:00

Hello

We run Logic Apps Standard on a Workflow Standard WS2 plan (elastic, minimum 2 instances, maximum burst 20) in West Europe. The workflows are stateful, the app is VNet integrated, and it calls an App Service backend through a private endpoint. Four Logic App resources share the same plan, and the affected workflows make roughly 130,000 backend HTTP calls per day.

Workflow pattern

A Service Bus peek-lock trigger starts a dequeue workflow, which calls an orchestrator workflow (built-in Workflow action), which calls a sync workflow (built-in Workflow action). The sync workflow has a single HTTP action to the backend, configured with retryPolicy type none and operationOptions DisableAsyncPattern. There is no request timeout override (default 225 seconds) and no custom host.json settings.

Problem

About 35 times per day (around 0.03% of calls), one execution of this HTTP action sends the same request to the backend twice, even though the backend processed the first request successfully and returned 200.

What the backend sees:

  • The first request is processed and the backend returns 200, typically within 0.3 to 1.5 seconds.
  • A second, identical request arrives 5 to 75 seconds later (median about 9 seconds), always from a different Logic App worker (a different VNet integration IP).
  • Both requests carry the same x-ms-workflow-run-id, x-ms-workflow-run-tracking-id, x-ms-action-tracking-id and W3C trace id. Only the per-request ids differ (x-ms-client-request-id / x-ms-tracking-id), and x-ms-activity-vector moves forward (for example IN.46 to IN.48). The User-Agent is azure-logic-apps/1.0 for both.

What the Logic App run history shows:

  • The action appears only once, with an empty retryHistory.
  • If the second request succeeds, the action shows Succeeded/OK with no error at all, so the duplicate is invisible in run history.

We confirmed it is not a Service Bus redelivery: the message had deliveryCount 1, the dequeue and orchestrator workflows each ran once, and the orchestrator invoked the child workflow once. The two requests belong to the same action execution.

Questions

  1. Under what conditions does the Logic Apps Standard runtime cancel an in-flight HTTP action and re-execute it on a different worker, without recording it in retryHistory?
  2. Can backend throttling due to worker shortage cause this, for example through a job lease expiring or the job being reclaimed while the HTTP call is in flight?
  3. Is there a supported way to stop a non-idempotent HTTP action from being re-executed (a host.json setting, a job lease or visibility timeout, or similar)?
  4. Would scaling up to WS3, adding always-ready instances, or tuning Jobs.BackgroundJobs.NumWorkersPerProcessorCount be expected to reduce this? Which would you recommend?
Azure Logic Apps
Azure Logic Apps

An Azure service that automates the access and use of data across clouds without writing code.

0 comments No comments

1 answer

Sort by: Oldest
  1. Hemant Bharadwaj 340 Reputation points Microsoft Employee
    2026-11-04T15:35:02.3766667+00:00

    Likely cause/summary: what you’re seeing matches at-least-once execution behavior under worker failover/reclaim conditions in Standard, where an in-flight HTTP call can be replayed by another worker even when retryPolicy: none (that setting controls connector retry policy, not all runtime-level re-dispatch scenarios).

    1. Treat this path as non-exactly-once and add idempotency at the backend (for example, dedupe by a business key + short TTL, or by a client-supplied idempotency key).
    2. Pass an explicit idempotency key from workflow to backend (for example compose one deterministic value per business operation, not per transport attempt).
    3. Keep retryPolicy: none for connector retries, but don’t rely on it as a global duplicate-prevention guarantee.
    4. Validate runtime pressure signals around duplicate windows (worker recycle events, scale events, host restarts, storage latency).
    5. If this workflow is highly sensitive to duplicates, open a support case with run IDs/action tracking IDs and timestamps so engineering can confirm whether failover/reclaim occurred.

    On your specific questions:

    • A runtime reclaim/failover can explain replay without populated retryHistory.
    • Worker shortage/scale churn can increase probability.
    • There is no supported setting that guarantees exactly-once delivery for non-idempotent outbound HTTP actions.
    • Scaling up/out (WS3, always-ready instances) can reduce incidence, but idempotency remains the required safety control.

    References:

    If you find this answer helpful, please upvote it. If this resolves your issue, please mark it as the accepted answer so that it can help others in the community.

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.