Associação de saída do Estado Dapr para o Azure Functions

A associação de saída de estado Dapr permite que você salve um valor em um estado Dapr durante uma execução de função.

Para obter informações sobre instalação e detalhes de configuração da extensão do Dapr, confira a Visão geral da extensão do Dapr.

Exemplo

A função C# pode ser criada usando um dos seguintes modos C#:

Modelo de execução Descrição
Modelo de trabalho isolado O código de função é executado em um processo de trabalho do .NET separado. Use com versões com suporte do .NET e do .NET Framework. Para saber mais, confira Desenvolver funções de processo de trabalho isolado no .NET.
Modelo em processo Seu código de função é executado no mesmo processo que o processo de host do Functions. Dá suporte apenas a versões LTS (suporte de longo prazo) do .NET. Para saber mais, confira Desenvolver funções de biblioteca de classes do .NET.

O exemplo a seguir demonstra o uso da associação de saída de estado Dapr para manter um novo estado no repositório de estado.

[FunctionName("StateOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "state/{key}")] HttpRequest req,
    [DaprState("statestore", Key = "{key}")] IAsyncCollector<string> state,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    await state.AddAsync(requestBody);

    return new OkResult();
}

O seguinte exemplo cria uma função "CreateNewOrderHttpTrigger" usando a associação DaprStateOutput com um HttpTrigger:

@FunctionName("CreateNewOrderHttpTrigger")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
        @DaprStateOutput(
            stateStore = "%StateStoreName%",
            key = "product")
        OutputBinding<String> product,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger (CreateNewOrderHttpTrigger) processed a request.");
}

No exemplo a seguir, a associação de saída de estado Dapr é emparelhada com um gatilho HTTP, que é registrado pelo objeto app:

const { app, trigger } = require('@azure/functions');

app.generic('StateOutputBinding', {
    trigger: trigger.generic({
        type: 'httpTrigger',
        authLevel: 'anonymous',
        methods: ['POST'],
        route: "state/{key}",
        name: "req"
    }),
    return: daprStateOutput,
    handler: async (request, context) => {
        context.log("Node HTTP trigger function processed a request.");

        const payload = await request.text();
        context.log(JSON.stringify(payload));

        return { value : payload };
    }
});

Os exemplos a seguir mostram gatilhos do Dapr em um arquivo function.json e o código do PowerShell que usa essas associações.

Aqui está o arquivo function.json para a saída daprState:

{
  "bindings": 
    {
      "type": "daprState",
      "stateStore": "%StateStoreName%",
      "direction": "out",
      "name": "order",
      "key": "order"
    }
}

Para obter mais informações sobre as propriedades do arquivo function.json, consulte a seção de Configuração.

No código:

using namespace System
using namespace Microsoft.Azure.WebJobs
using namespace Microsoft.Extensions.Logging
using namespace Microsoft.Azure.WebJobs.Extensions.Dapr
using namespace Newtonsoft.Json.Linq

param (
    $payload
)

# C# function processed a CreateNewOrder request from the Dapr Runtime.
Write-Host "PowerShell function processed a CreateNewOrder request from the Dapr Runtime."

# Payload must be of the format { "data": { "value": "some value" } }

# Convert the object to a JSON-formatted string with ConvertTo-Json
$jsonString = $payload| ConvertTo-Json

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name order -Value $payload["data"]

O exemplo a seguir mostra uma associação de saída do Estado Dapr, que usa o modelo de programação do Python v2. Para usar daprState no código do aplicativo de funções do Python:

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="HttpTriggerFunc")
@app.route(route="req", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_state_output(arg_name="state", state_store="statestore", key="newOrder")
def main(req: func.HttpRequest, state: func.Out[str] ) -> str:
    # request body must be passed this way '{\"value\": { \"key\": \"some value\" } }'
    body = req.get_body()
    if body is not None:
        state.set(body.decode('utf-8'))
        logging.info(body.decode('utf-8'))
    else:
        logging.info('req body is none')
    return 'ok'

Atributos

No modelo em processo, use DaprState para definir uma associação de saída do estado Dapr, que dá suporte a estes parâmetros:

Parâmetro Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
StateStore O nome do repositório de estado para salvar o estado. ✔️
Chave O nome da chave para salvar o estado no repositório de estado. ✔️ ✔️
Valor Obrigatório. O valor que está sendo armazenado. ✔️

Anotações

A anotação DaprStateOutput permite que você acesse um repositório de estado.

Elemento Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
stateStore O nome do repositório de estado para salvar o estado. ✔️
chave O nome da chave para salvar o estado no repositório de estado. ✔️ ✔️
value Obrigatório. O valor que está sendo armazenado. ✔️

Configuração

A tabela a seguir explica as propriedades de configuração de associação que você definiu no código.

Propriedade Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
stateStore O nome do repositório de estado para salvar o estado. ✔️
chave O nome da chave para salvar o estado no repositório de estado. ✔️ ✔️
value Obrigatório. O valor que está sendo armazenado. ✔️

A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json.

Propriedade function.json Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
stateStore O nome do repositório de estado para salvar o estado. ✔️
chave O nome da chave para salvar o estado no repositório de estado. ✔️ ✔️
value Obrigatório. O valor que está sendo armazenado. ✔️

A tabela a seguir explica as propriedades de configuração de associação para @dapp.dapr_state_output definidas no código do Python.

Propriedade Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
stateStore O nome do repositório de estado para salvar o estado. ✔️
chave O nome da chave para salvar o estado no repositório de estado. ✔️ ✔️
value Obrigatório. O valor que está sendo armazenado. ✔️

Se as propriedades forem definidas em Atributos e RequestBody, a prioridade será fornecida aos dados disponíveis em RequestBody.

Consulte a Seção de exemplo para obter exemplos completos.

Uso

Para usar a associação de saída do estado Dapr, comece configurando um componente de repositório do estado Dapr. Sabia mais sobre qual componente usar e como configurá-lo na documentação oficial do Dapr.

Para usar a opção daprState no Python v2, configure seu projeto com as dependências corretas.

  1. Criar e ativar um ambiente virtual.

  2. No arquivo requirements.text, adicione a seguinte linha:

    azure-functions==1.18.0b3
    
  3. No terminal, instale a biblioteca do Python.

    pip install -r .\requirements.txt
    
  4. Altere seu arquivo local.setting.json com a configuração a seguir:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Próximas etapas

Saiba mais sobre o gerenciamento do Estado do Dapr.