Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Por padrão, o Durable Functions usa o tempo de execução do Azure Functions para hospedar orquestrações. No entanto, pode haver certos cenários em que você precisa de mais controle sobre o código que escuta eventos. Este artigo mostra como implementar sua orquestração usando o SDK WebJobs. Para ver uma comparação mais detalhada entre Functions e WebJobs, consulte Compare Functions e WebJobs.
O Azure Functions e a extensão Durable Functions são criados no SDK WebJobs. O host de trabalho no SDK de WebJobs é o tempo de execução no Azure Functions. Se você precisar controlar o comportamento de maneiras não possíveis no Azure Functions, poderá desenvolver e executar Funções Duráveis usando o SDK WebJobs você mesmo.
Na versão 3.x do SDK WebJobs, o host é uma implementação do IHost
, e na versão 2.x você usa o JobHost
objeto.
O exemplo de funções duráveis de encadeamento está disponível em uma versão 2.x do WebJobs SDK: baixe ou clone o repositório de funções duráveis e faça checkout da ramificação v1 e vá para a pasta samples\webjobssdk\chaining .
Pré-requisitos
Este artigo pressupõe que você esteja familiarizado com os conceitos básicos do SDK WebJobs, desenvolvimento de biblioteca de classes C# para Azure Functions e Durable Functions. Se você precisar de uma introdução a esses conceitos, consulte os seguintes recursos:
Para concluir as etapas neste artigo:
Instale o Visual Studio 2019 com a carga de trabalho de desenvolvimento do Azure.
Se você já tiver o Visual Studio, mas não tiver essa carga de trabalho, adicione a carga de trabalho selecionando Ferramentas>Obter Ferramentas e Recursos.
(Pode utilizar Visual Studio Code em vez disso, mas algumas das instruções são específicas para Visual Studio.)
Instale e execute o emulador de armazenamento Azurite. Uma alternativa é atualizar o arquivo App.config com uma cadeia de conexão real do Armazenamento do Azure.
Versões do SDK de WebJobs
Este artigo explica como desenvolver um projeto WebJobs SDK 2.x (equivalente ao Azure Functions versão 1.x). Para obter informações sobre a versão 3.x, consulte WebJobs SDK 3.x mais adiante neste artigo.
Criar uma aplicação de consola
Para executar Durable Functions como WebJobs, você deve primeiro criar um aplicativo de console. Um projeto SDK WebJobs é apenas um projeto de aplicativo de console com os pacotes NuGet apropriados instalados.
Na caixa de diálogo Visual Studio New Project, selecione Windows Classic Desktop>Console App (.NET Framework). No arquivo de projeto, o TargetFrameworkVersion
deve ser v4.6.1
.
O Visual Studio também tem um modelo de projeto WebJob, que você pode usar selecionando Cloud>Azure WebJob (.NET Framework). Este modelo instala muitos pacotes, alguns dos quais você pode não precisar.
Instalar pacotes NuGet
Você precisa de pacotes NuGet para o SDK WebJobs, ligações principais, a estrutura de log e a extensão Durable Task. Aqui estão os comandos do Console do Gerenciador de Pacotes para esses pacotes, com os números de versão estáveis mais recentes na data em que este artigo foi escrito:
Install-Package Microsoft.Azure.WebJobs.Extensions -version 2.2.0
Install-Package Microsoft.Extensions.Logging -version 2.0.1
Install-Package Microsoft.Azure.WebJobs.Extensions.DurableTask -version 1.8.7
Você também precisa de provedores de registro. Os comandos a seguir instalam o provedor do Azure Application Insights e o ConfigurationManager
. O ConfigurationManager
permite que você obtenha a chave de instrumentação do Application Insights nas configurações do aplicativo.
Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights -version 2.2.0
Install-Package System.Configuration.ConfigurationManager -version 4.4.1
O comando a seguir instala o provedor do console:
Install-Package Microsoft.Extensions.Logging.Console -version 2.0.1
Código JobHost
Depois de criar o aplicativo de console e instalar os pacotes NuGet de que você precisa, você está pronto para usar as Funções Duráveis. Você faz isso usando o código JobHost.
Para usar a extensão Durable Functions, chame UseDurableTask
o JobHostConfiguration
objeto em seu Main
método:
var config = new JobHostConfiguration();
config.UseDurableTask(new DurableTaskExtension
{
HubName = "MyTaskHub",
};
Para obter uma lista de propriedades que você pode definir no DurableTaskExtension
objeto, consulte host.json.
O Main
método também é o local para configurar provedores de log. O exemplo a seguir configura o console e os provedores do Application Insights.
static void Main(string[] args)
{
using (var loggerFactory = new LoggerFactory())
{
var config = new JobHostConfiguration();
config.DashboardConnectionString = "";
var instrumentationKey =
ConfigurationManager.AppSettings["APPINSIGHTS_INSTRUMENTATIONKEY"];
config.LoggerFactory = loggerFactory
.AddApplicationInsights(instrumentationKey, null)
.AddConsole();
config.UseTimers();
config.UseDurableTask(new DurableTaskExtension
{
HubName = "MyTaskHub",
});
var host = new JobHost(config);
host.RunAndBlock();
}
}
Funções
As Funções Duráveis no contexto de WebJobs diferem um pouco das Funções Duráveis no contexto do Azure Functions. É importante estar ciente das diferenças ao escrever seu código.
O SDK de WebJobs não suporta os seguintes recursos do Azure Functions:
Atributo FunctionName
Em um projeto SDK WebJobs, o nome do método de uma função é o nome da função. O FunctionName
atributo é usado somente no Azure Functions.
Acionador HTTP
O SDK WebJobs não tem um gatilho HTTP. O cliente de orquestração do projeto de exemplo usa um gatilho de temporizador:
public static async Task CronJob(
[TimerTrigger("0 */2 * * * *")] TimerInfo timer,
[OrchestrationClient] DurableOrchestrationClient client,
ILogger logger)
{
...
}
API de gerenciamento HTTP
Como não tem nenhum gatilho HTTP, o SDK WebJobs não tem API de gerenciamento HTTP.
Em um projeto SDK WebJobs, você pode chamar métodos no objeto de cliente de orquestração, em vez de enviar solicitações HTTP. Os métodos a seguir correspondem às três tarefas que você pode fazer com a API de gerenciamento HTTP:
GetStatusAsync
RaiseEventAsync
TerminateAsync
A função de cliente de orquestração no projeto de exemplo inicia a função de orquestrador e, em seguida, entra em um loop que chama GetStatusAsync
a cada 2 segundos:
string instanceId = await client.StartNewAsync(nameof(HelloSequence), input: null);
logger.LogInformation($"Started new instance with ID = {instanceId}.");
DurableOrchestrationStatus status;
while (true)
{
status = await client.GetStatusAsync(instanceId);
logger.LogInformation($"Status: {status.RuntimeStatus}, Last update: {status.LastUpdatedTime}.");
if (status.RuntimeStatus == OrchestrationRuntimeStatus.Completed ||
status.RuntimeStatus == OrchestrationRuntimeStatus.Failed ||
status.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
{
break;
}
await Task.Delay(TimeSpan.FromSeconds(2));
}
Executar o exemplo
Você tem o Durable Functions configurado para ser executado como um WebJob e agora tem uma compreensão de como isso será diferente da execução do Durable Functions como Functions do Azure autônomo. Neste ponto, vê-lo funcionar em uma amostra pode ser útil.
Esta seção fornece uma visão geral de como executar o projeto de exemplo. Para obter instruções detalhadas que explicam como executar um projeto SDK WebJobs localmente e implantá-lo em um WebJob do Azure, consulte Introdução ao SDK WebJobs.
Executar localmente
Verifique se o emulador de armazenamento está em execução (consulte Pré-requisitos).
Se você quiser ver os logs no Application Insights quando executar o projeto localmente:
a. Crie um recurso do Application Insights e use o tipo de aplicativo Geral para ele.
b. Salve a chave de instrumentação no arquivo App.config .
Execute o projeto.
Executar no Azure
Crie um aplicativo Web e uma conta de armazenamento.
No aplicativo Web, salve as informações de conexão de armazenamento em uma configuração de aplicativo chamada
AzureWebJobsStorage
. Para obter o mais alto nível de segurança, você deve usar uma conexão de identidade gerenciada com sua conta de armazenamento.Crie um recurso do Application Insights e use o tipo de aplicativo Geral para ele.
Salve a chave de instrumentação em uma configuração de aplicativo chamada
APPINSIGHTS_INSTRUMENTATIONKEY
.Implante como um WebJob.
SDK WebJobs 3.x
Este artigo explica como desenvolver um projeto WebJobs SDK 2.x. Se você estiver desenvolvendo um projeto WebJobs SDK 3.x , esta seção o ajudará a entender as diferenças.
A principal alteração introduzida é o uso do .NET Core em vez do .NET Framework. Para criar um projeto WebJobs SDK 3.x, as instruções são as mesmas, com estas exceções:
Crie um aplicativo de console .NET Core. Na caixa de diálogo Novo Projeto do Visual Studio, selecione Aplicativo de Console do .NET Core>(.NET Core). O arquivo de projeto especifica que
TargetFramework
énetcoreapp2.x
.Escolha a versão de lançamento WebJobs SDK 3.x dos seguintes pacotes:
Microsoft.Azure.WebJobs.Extensions
Microsoft.Azure.WebJobs.Extensions.Storage
Microsoft.Azure.WebJobs.Logging.ApplicationInsights
Defina a cadeia de conexão de armazenamento e a chave de instrumentação do Application Insights em um arquivo appsettings.json , usando a estrutura de configuração do .NET Core. Eis um exemplo:
{ "AzureWebJobsStorage": "<replace with storage connection string>", "APPINSIGHTS_INSTRUMENTATIONKEY": "<replace with Application Insights instrumentation key>" }
Importante
Para obter o mais alto nível de segurança, você deve usar uma conexão de identidade gerenciada com sua conta de armazenamento. Para obter mais informações, consulte Como usar identidades gerenciadas para o Serviço de Aplicativo e o Azure Functions.
Altere o código do
Main
método para fazer isso. Eis um exemplo:static void Main(string[] args) { var hostBuilder = new HostBuilder() .ConfigureWebJobs(config => { config.AddAzureStorageCoreServices(); config.AddAzureStorage(); config.AddTimers(); config.AddDurableTask(options => { options.HubName = "MyTaskHub"; options.AzureStorageConnectionStringName = "AzureWebJobsStorage"; }); }) .ConfigureLogging((context, logging) => { logging.AddConsole(); logging.AddApplicationInsights(config => { config.InstrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"]; }); }) .UseConsoleLifetime(); var host = hostBuilder.Build(); using (host) { host.Run(); } }
Próximos passos
Para saber mais sobre o SDK WebJobs, consulte Como usar o SDK WebJobs.