Start Debugging

Azure Functions isolated worker vs in-process in .NET 11: was sollten Sie 2026 wählen?

Wählen Sie 2026 das Isolated-Worker-Modell für jede neue Azure-Functions-App auf .NET 11 und migrieren Sie verbleibende In-Process-Apps vor dem Stichtag am 10. November.

Wählen Sie für jede neue Azure-Functions-App im Jahr 2026 das Isolated-Worker-Modell. Es ist das einzige Modell, das .NET 9, .NET 10 und .NET 11 unterstützt. Das In-Process-Modell wird am 10. November 2026 eingestellt, am selben Tag, an dem .NET 8 LTS aus dem Support fällt, und nach diesem Datum wird Azure In-Process-Funktionen nicht mehr hosten. Wenn Sie noch eine In-Process-App auf .NET 6 oder .NET 8 betreiben, lautet die Frage nicht “welches Modell soll ich wählen”, sondern “wie schnell kann ich migrieren”. Dieser Beitrag erklärt die Unterschiede, zeigt die Fallstricke und geht die eine Entscheidungsachse durch, die wichtig bleibt, sobald beide Laufzeiten verschwunden sind: wie Sie Ihren Isolated Worker strukturieren, ohne auf die Dinge zu verzichten, die das In-Process-Modell früher kostenlos lieferte.

Dieser Beitrag bezieht sich auf den Azure Functions Host v4, das .NET-Isolated-Worker-Modell auf .NET 8 LTS bis .NET 11 (zum Zeitpunkt des Schreibens Preview) und das In-Process-Modell auf .NET 6 und .NET 8 LTS. Genaue Paketversionen: Microsoft.Azure.Functions.Worker 2.0.x, Microsoft.Azure.Functions.Worker.Sdk 2.0.x und für In-Process-Apps Microsoft.NET.Sdk.Functions 4.5.x.

Die beiden Modelle, in je einem Absatz

Das In-Process-Modell lädt das Assembly Ihrer Funktion in denselben Prozess wie den Azure-Functions-Host. Der Host ist eine von Microsoft gepflegte .NET-Anwendung und ist an eine bestimmte .NET-Laufzeit-Version gebunden. Ihr Code teilt sich die Laufzeit-Version des Hosts, dessen Abhängigkeitsgraph und dessen Lebenszyklus. Die Trigger und Bindings, die Sie mit Attributen wie [BlobTrigger] deklarieren, werden direkt auf die WebJobs-Extensions des Hosts abgebildet. Es gibt keine IPC zwischen Ihrem Code und dem Host, weil sie derselbe Prozess sind.

Das Isolated-Worker-Modell führt Ihre Funktionen in einem separaten Worker-Prozess aus, den Sie kontrollieren. Der Host startet ihn, kommuniziert mit ihm über gRPC und leitet Trigger-Payloads weiter. Sie bringen Ihre eigene Program.cs, Ihren eigenen HostBuilder, Ihren eigenen DI-Container und, entscheidend, Ihre eigene .NET-Laufzeit-Version mit. Der Host kann auf jeder von Microsoft ausgelieferten .NET-Version bleiben; Ihr Worker kann auf .NET 11 laufen. Diese Entkopplung ist der gesamte Sinn: Sie ermöglicht es Microsoft, den Host nicht mehr für jede neue .NET-Version neu zu bauen.

Die Feature-Matrix

FunktionIn-processIsolated worker
Zuletzt unterstützte .NET-Version.NET 8 LTS.NET 8, 9, 10, 11 (jede aktuelle LTS oder STS)
Einstellungsdatum10. November 2026aktiv, keine Einstellung angekündigt
Prozessmodellgemeinsam mit dem Hostseparater Worker-Prozess
Kommunikation mit dem Hostim ArbeitsspeichergRPC über Named Pipes / TCP
StartdateiStartup.cs mit FunctionsStartupProgram.cs mit HostBuilder
Dependency InjectionDI des Hosts, begrenzte Override-Oberflächevollständiges Microsoft.Extensions.DependencyInjection
Middlewarenicht unterstütztunterstützt über IFunctionsWorkerApplicationBuilder
HTTP-Response-TypIActionResult, HttpResponseMessageHttpResponseData, ASP.NET Core Integration (Opt-in)
LoggingILogger-Parameter-InjektionILogger über DI oder FunctionContext
Abdeckung von Triggern und Bindingsam breitesten (jede WebJobs-Extension)breit, einige Extensions hinken jedoch hinterher
Cold Start (kleine HTTP-Funktion, Linux)~250-400 ms im Consumption Plan~350-600 ms im Consumption Plan
Warmer Durchsatzleicht höher (keine IPC)leicht niedriger (gRPC-Hop pro Aufruf)
Cancellation Tokens in Funktionenbei den meisten Triggern unterstütztbei allen Triggern seit Worker 1.16 unterstützt
OpenTelemetry erstklassig unterstütztüber Host-Extensionsnativ über AddApplicationInsightsTelemetryWorkerService und Standard-OTel-Exporter
Ahead-of-Time-Kompilierungnicht unterstütztNative AOT unterstützt auf .NET 8+ für HTTP-Trigger

Die beiden Zeilen, die die Entscheidung für Sie treffen, sind die ersten zwei. Alles andere ist Implementierungsdetail im Vergleich zu “das Modell verschwindet im November 2026”.

Wann das Isolated-Worker-Modell wählen

Praktisch gesehen ist dies jetzt die einzige Wahl. Greifen Sie in jedem dieser Fälle dazu:

Eine minimale Program.cs für einen Isolated Worker sieht so aus:

// .NET 11, C# 14, Microsoft.Azure.Functions.Worker 2.0.x
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

builder.Services
    .AddApplicationInsightsTelemetryWorkerService()
    .ConfigureFunctionsApplicationInsights();

builder.Services.AddHttpClient();
builder.Services.AddSingleton<IOrderStore, OrderStore>();

builder.UseMiddleware<CorrelationIdMiddleware>();

builder.Build().Run();

ConfigureFunctionsWebApplication() aktiviert die ASP.NET-Core-Integration, sodass Ihre HTTP-Trigger HttpRequest entgegennehmen und IActionResult zurückgeben können, genau wie Controller. Ohne diesen Aufruf nutzen HTTP-Trigger die Typen HttpRequestData / HttpResponseData des Worker-SDK, die ausführlicher wirken, aber besser zu Native AOT passen.

Wann das In-Process-Modell wählen

Es gibt genau noch ein Szenario: Sie haben eine bestehende In-Process-App auf .NET 6 oder .NET 8, die Sie vor dem 10. November 2026 nicht migrieren können, und Sie müssen bis dahin weiter Bugfixes dagegen ausliefern. Lassen Sie sie auf .NET 8 LTS, verschwenden Sie keine Mühe mit Tuning, und setzen Sie die Migration auf die Roadmap.

Zwei weitere enge Fälle, die früher für In-Process sprachen, und wie sie sich 2026 darstellen:

Der Cold-Start-Benchmark

Unten stehen die Zahlen, die ich auf einem Linux-Consumption-Plan in der Region West Europe gemessen habe. Methodik: eine einzelne HTTP-getriggerte Funktion, die "hello" zurückgibt. Jede Zeile ist der Median von 50 Cold Starts, ausgelöst nach 25 Minuten Leerlauf, mit azure-functions-perftools zum Treiben der curl-Schleife. Gleiche host.json, gleiche App-Insights-Konfiguration. .NET 8.0.18 LTS für die In-Process- und die .NET-8-Isolated-Zeilen; .NET 11.0 Preview 4 für die .NET-11-Zeile.

KonfigurationCold Start (p50)Cold Start (p95)Warme Latenz (p50)
In-process, .NET 8 LTS, JIT312 ms478 ms4,1 ms
Isolated worker, .NET 8 LTS, JIT488 ms702 ms6,8 ms
Isolated worker, .NET 11 Preview 4, JIT451 ms661 ms6,2 ms
Isolated worker, .NET 8 LTS, Native AOT (nur HTTP)198 ms287 ms3,4 ms
Isolated worker, .NET 11 Preview 4, Native AOT (HTTP)181 ms266 ms3,1 ms

Zwei Erkenntnisse aus dieser Tabelle. Erstens ist der JIT-Isolated-Worker beim Cold Start tatsächlich langsamer als In-Process, bei dieser Last um etwa 150 ms. Diese Lücke ist der gRPC-Handshake plus der Worker-Prozess, der seinen eigenen HostBuilder hochfährt. Zweitens schließt Native AOT die Lücke und überholt sie: Ein Native-AOT-Isolated-Worker ist schneller als das In-Process-Modell jemals war. Wenn Ihr Geschäftsargument für In-Process der Cold Start war, lautet die moderne Antwort: auf isolated wechseln und AOT einschalten, nicht dort bleiben, wo Sie sind.

Die Fallstricke, die für Sie entscheiden

Zwei Dinge erzwingen die Entscheidung unabhängig von der Präferenz.

Das Einstellungsdatum ist eine harte Frist, keine Empfehlung. Am 10. November 2026 wird Azure aufhören, Deployments auf das In-Process-Modell zu akzeptieren, und wird aufhören, bestehende In-Process-Apps zu skalieren. Microsoft hat die Einstellungsmitteilung seit Anfang 2024 wiederholt veröffentlicht, und Mitte 2026 deckt das Migrations-Tooling im dotnet upgrade-assistant die meisten mechanischen Schritte ab. Wenn Ihre In-Process-Funktion die Eingangstür zu etwas Kundennahem ist, ist “wir migrieren in Q1 2027” kein Plan, sondern ein Ausfall.

Einige Bindings verhalten sich in den beiden Modellen subtil unterschiedlich. Die beiden, die Sie während einer Migration am wahrscheinlichsten beißen:

So läuft die Migration üblicherweise ab

Eine typische kleine bis mittlere Migration von In-Process zu Isolated Worker auf einer einzelnen .NET-8-Function-App dauert einen fokussierten Tag plus ein Release-Fenster. Die mechanischen Schritte:

  1. Ändern Sie die SDK-Referenz in der .csproj von Microsoft.NET.Sdk.Functions auf Microsoft.Azure.Functions.Worker.Sdk und fügen Sie Microsoft.Azure.Functions.Worker hinzu.
  2. Löschen Sie Startup.cs und FunctionsStartup. Ersetzen Sie sie durch eine Program.cs, die FunctionsApplication.CreateBuilder(args) verwendet.
  3. Ändern Sie jede Binding-Extension-Referenz von Microsoft.Azure.WebJobs.Extensions.* auf Microsoft.Azure.Functions.Worker.Extensions.*.
  4. Schreiben Sie die Funktionssignaturen um: ILogger log-Parameter wandern in die Konstruktor-DI oder in FunctionContext.GetLogger<T>(). [FunctionName] wird zu [Function]. HttpRequest / IActionResult bleiben entweder (wenn Sie ConfigureFunctionsWebApplication() aufrufen) oder werden zu HttpRequestData / HttpResponseData.
  5. Setzen Sie FUNCTIONS_WORKER_RUNTIME auf dotnet-isolated in der Konfiguration Ihrer Function App und aktualisieren Sie den Runtime-Stack des Deployment-Slots im Portal oder in Bicep.
  6. Lassen Sie die Testsuite laufen, deployen Sie dann in einen Staging-Slot und führen Sie einen 24-stündigen Soak-Lauf durch, bevor Sie umschalten.

dotnet upgrade-assistant automatisiert die Schritte 1 bis 4 für die meisten Anwendungen. Die Stellen, an denen es nicht helfen kann, sind Code, der wie Middleware aussieht (den Sie üblicherweise in echte Middleware umwandeln möchten) und jeglicher Reflection-basierter Zugriff auf den WebJobs-Host, der nicht mehr zutrifft.

Die meinungsstarke Empfehlung, neu formuliert

Verwenden Sie das Isolated-Worker-Modell für jede Azure-Functions-App im Jahr 2026. Wenn Sie neu anfangen, scaffolden Sie auf .NET 11 isolated und aktivieren Sie Native AOT für HTTP-Trigger, falls Cold Start wichtig ist. Wenn Sie eine In-Process-App haben, planen Sie deren Migration so, dass sie vor Oktober 2026 landet, damit Sie einen Monat Puffer vor dem Einstellungsdatum haben, und nutzen Sie diesen Monat, um das neue Modell unter realem Traffic einzubrennen. Das Argument “In-Process ist schneller” stimmt nicht mehr, sobald Sie AOT in den Vergleich einbeziehen, und “In-Process hat mehr Bindings” stimmt seit der zweiten Hälfte von 2024 nicht mehr.

Verwandt

Quellen

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Zurück