Visão geral das funções duráveis no trabalhador isolado do .NET
Este artigo é uma visão geral das funções duráveis no trabalhador isolado do .NET. O trabalhador isolado permite que seu aplicativo Durable Functions seja executado em uma versão .NET diferente da do host do Azure Functions.
Por que usar funções duráveis no trabalhador isolado do .NET?
O uso desse modelo permite que você obtenha todos os grandes benefícios que vêm com o processo de trabalho isolado do Azure Functions .NET. Para obter mais informações, consulte Benefícios do modelo de trabalhador isolado. Além disso, este novo SDK inclui alguns novos recursos.
Melhorias de recursos em relação às funções duráveis em processo
- A entrada de orquestração pode ser injetada diretamente:
MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
- Suporte para chamadas fortemente tipadas e atividades e orquestrações baseadas em classe (NOTA: na pré-visualização. Para mais informações, consulte aqui.)
- Além de todos os benefícios do trabalhador isolado do Azure Functions .NET.
Gerador de código-fonte e atividades e orquestrações baseadas em classe
Requisito: adicionar <PackageReference Include="Microsoft.DurableTask.Generators" Version="1.0.0-preview.1" />
ao seu projeto.
Ao adicionar o pacote gerador de código-fonte, você tem acesso a dois novos recursos:
- Atividades e orquestrações baseadas em classes, uma maneira alternativa de escrever funções duráveis. Em vez de "baseado em funções", você escreve classes fortemente tipadas, que herdam tipos do SDK durável.
- Métodos de extensão fortemente tipados para invocar suborquestrações e atividades. Esses métodos de extensão também podem ser usados a partir de atividades e orquestrações "baseadas em funções".
Exemplo baseado em função
public static class MyFunctions
{
[Function(nameof(MyActivity))]
public static async Task<string> MyActivity([ActivityTrigger] string input)
{
// implementation
}
[Function(nameof(MyOrchestration))]
public static async Task<string> MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, string input)
{
// implementation
return await context.CallActivityAsync(nameof(MyActivity), input);
}
}
Exemplo baseado em classe
[DurableTask(nameof(MyActivity))]
public class MyActivity : TaskActivity<string, string>
{
private readonly ILogger logger;
public MyActivity(ILogger<MyActivity> logger) // activities have access to DI.
{
this.logger = logger;
}
public async override Task<string> RunAsync(TaskActivityContext context, string input)
{
// implementation
}
}
[DurableTask(nameof(MyOrchestration))]
public class MyOrchestration : TaskOrchestrator<string, string>
{
public async override Task<string> RunAsync(TaskOrchestrationContext context, string input)
{
ILogger logger = context.CreateReplaySafeLogger<MyOrchestration>(); // orchestrations do NOT have access to DI.
// An extension method was generated for directly invoking "MyActivity".
return await context.CallMyActivityAsync(input);
}
}
Entidades duradouras
As entidades duráveis são suportadas no trabalhador isolado do .NET. Consulte o guia do desenvolvedor.
Guia de migração
Este guia pressupõe que você esteja começando com um projeto .NET Durable Functions 2.x.
Atualize o seu projeto
A primeira etapa é atualizar seu projeto para o Azure Functions .NET isolado. Em seguida, atualize as referências do pacote NuGet do Durable Functions.
Velho:
<ItemGroup>
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.9.0" />
</ItemGroup>
Novo:
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.1.0" />
</ItemGroup>
Atualize o seu código
Durable Functions for .NET isolated worker é um pacote totalmente novo com diferentes tipos e namespaces. Como resultado, há alterações necessárias no seu código, mas muitas das APIs se alinham sem a necessidade de alterações.
Esquema Host.json
O esquema para Durable Functions .NET trabalhador isolado e Durable Functions 2.x permaneceu o mesmo, nenhuma alteração deve ser necessária.
Alterações na API pública
Esta tabela não é uma lista exaustiva de alterações.
2.x | Isolado |
---|---|
IDurableOrchestrationClient |
DurableTaskClient |
IDurableOrchestrationClient.StartNewAsync |
DurableTaskClient.ScheduleNewOrchestrationInstanceAsync |
IDurableEntityClient.SignalEntityAsync |
DurableTaskClient.Entities.SignalEntityAsync |
IDurableEntityClient.ReadEntityStateAsync |
DurableTaskClient.Entities.GetEntityAsync |
IDurableEntityClient.ListEntitiesAsync |
DurableTaskClient.Entities.GetAllEntitiesAsync |
IDurableEntityClient.CleanEntityStorageAsync |
DurableTaskClient.Entities.CleanEntityStorageAsync |
IDurableOrchestrationContext |
TaskOrchestrationContext |
IDurableOrchestrationContext.GetInput<T>() |
TaskOrchestrationContext.GetInput<T>() ou injetar entrada como parâmetro: MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input) |
DurableActivityContext |
Sem equivalente |
DurableActivityContext.GetInput<T>() |
Injetar entrada como parâmetro MyActivity([ActivityTrigger] T input) |
IDurableOrchestrationContext.CallActivityWithRetryAsync |
TaskOrchestrationContext.CallActivityAsync , incluir TaskOptions parâmetro com detalhes de repetição. |
IDurableOrchestrationContext.CallSubOrchestratorWithRetryAsync |
TaskOrchestrationContext.CallSubOrchestratorAsync , incluir TaskOptions parâmetro com detalhes de repetição. |
IDurableOrchestrationContext.CallHttpAsync |
TaskOrchestrationContext.CallHttpAsync |
IDurableOrchestrationContext.CreateReplaySafeLogger(ILogger) |
TaskOrchestrationContext.CreateReplaySafeLogger<T>() ou TaskOrchestrationContext.CreateReplaySafeLogger(string) |
IDurableOrchestrationContext.CallEntityAsync |
TaskOrchestrationContext.Entities.CallEntityAsync |
IDurableOrchestrationContext.SignalEntity |
TaskOrchestrationContext.Entities.SignalEntityAsync |
IDurableOrchestrationContext.LockAsync |
TaskOrchestrationContext.Entities.LockEntitiesAsync |
IDurableOrchestrationContext.IsLocked |
TaskOrchestrationContext.Entities.InCriticalSection |
IDurableEntityContext |
TaskEntityContext . |
IDurableEntityContext.EntityName |
TaskEntityContext.Id.Name |
IDurableEntityContext.EntityKey |
TaskEntityContext.Id.Key |
IDurableEntityContext.OperationName |
TaskEntityOperation.Name |
IDurableEntityContext.FunctionBindingContext |
Removido, adicionar FunctionContext como um parâmetro de entrada |
IDurableEntityContext.HasState |
TaskEntityOperation.State.HasState |
IDurableEntityContext.BatchSize |
Removido |
IDurableEntityContext.BatchPosition |
Removido |
IDurableEntityContext.GetState |
TaskEntityOperation.State.GetState |
IDurableEntityContext.SetState |
TaskEntityOperation.State.SetState |
IDurableEntityContext.DeleteState |
TaskEntityOperation.State.SetState(null) |
IDurableEntityContext.GetInput |
TaskEntityOperation.GetInput |
IDurableEntityContext.Return |
Removidos. Valor de retorno do método usado em vez disso. |
IDurableEntityContext.SignalEntity |
TaskEntityContext.SignalEntity |
IDurableEntityContext.StartNewOrchestration |
TaskEntityContext.ScheduleNewOrchestration |
IDurableEntityContext.DispatchAsync |
TaskEntityDispatcher.DispatchAsync . Params do construtor removidos. |
IDurableOrchestrationClient.GetStatusAsync |
DurableTaskClient.GetInstanceAsync |
Mudanças comportamentais
- O comportamento padrão de serialização foi alterado de
Newtonsoft.Json
paraSystem.Text.Json
. Para obter mais informações, veja aqui.