Compartilhar via


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

A associação de saída de publicação dapr permite que você publique uma mensagem em um tópico dapr durante uma execução de função.

Para obter mais informações sobre detalhes de instalação e configuração da extensão Dapr, consulte a Visão geral da extensão 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, consulte Guia para executar o C# Azure Functions no modelo de trabalho isolado.
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 da biblioteca de classes C# usando o Azure Functions.

O exemplo a seguir demonstra o uso de uma associação de saída de publicação dapr para executar uma operação de publicação de Dapr em um componente e tópico pub/sub.

[FunctionName("PublishOutputBinding")]
public static void Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "topic/{topicName}")] HttpRequest req,
    [DaprPublish(PubSubName = "%PubSubName%", Topic = "{topicName}")] out DaprPubSubEvent pubSubEvent,
    ILogger log)
{
    string requestBody = new StreamReader(req.Body).ReadToEnd();
    pubSubEvent = new DaprPubSubEvent(requestBody);
}

O exemplo a seguir cria uma "TransferEventBetweenTopics" função usando a DaprPublishOutput associação com um DaprTopicTrigger:

@FunctionName("TransferEventBetweenTopics")
public String run(
        @DaprTopicTrigger(
            pubSubName = "%PubSubName%",
            topic = "A")
            String request,
        @DaprPublishOutput(
            pubSubName = "%PubSubName%",
            topic = "B")
        OutputBinding<String> payload,
        final ExecutionContext context) throws JsonProcessingException {
    context.getLogger().info("Java function processed a TransferEventBetweenTopics request from the Dapr Runtime.");
}

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

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

app.generic('PublishOutputBinding', {
    trigger: trigger.generic({
        type: 'httpTrigger',
        authLevel: 'anonymous',
        methods: ['POST'],
        route: "topic/{topicName}",
        name: "req"
    }),
    return: daprPublishOutput,
    handler: async (request, context) => {
        context.log("Node HTTP trigger function processed a request.");
        const payload = await request.text();
        context.log(JSON.stringify(payload));

        return { payload: 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 o daprPublish:

{
  "bindings": 
    {
      "type": "daprPublish",
      "direction": "out",
      "name": "pubEvent",
      "pubsubname": "%PubSubName%",
      "topic": "B"
    }
}

Para obter mais informações sobre as propriedades do arquivo function.json, consulte a seção 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

# Example to use Dapr Service Invocation Trigger and Dapr State Output binding to persist a new state into statestore
param (
    $subEvent
)

Write-Host "PowerShell function processed a TransferEventBetweenTopics request from the Dapr Runtime."

# Convert the object to a JSON-formatted string with ConvertTo-Json
$jsonString = $subEvent["data"]

$messageFromTopicA = "Transfer from Topic A: $jsonString".Trim()

$publish_output_binding_req_body = @{
    "payload" = $messageFromTopicA
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name pubEvent -Value $publish_output_binding_req_body

O exemplo a seguir mostra uma associação de saída do Dapr Publish, que usa o modelo de programação do Python v2. Para usar daprPublish em seu 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="TransferEventBetweenTopics")
@app.dapr_topic_trigger(arg_name="subEvent", pub_sub_name="%PubSubName%", topic="A", route="A")
@app.dapr_publish_output(arg_name="pubEvent", pub_sub_name="%PubSubName%", topic="B")
def main(subEvent, pubEvent: func.Out[bytes]) -> None:
    logging.info('Python function processed a TransferEventBetweenTopics request from the Dapr Runtime.')
    subEvent_json = json.loads(subEvent)
    payload = "Transfer from Topic A: " + str(subEvent_json["data"])
    pubEvent.set(json.dumps({"payload": payload}).encode('utf-8'))

Atributos

No modelo em processo, use o DaprPublish para definir uma associação de saída de publicação dapr, que dá suporte a esses parâmetros:

Propriedade function.json Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
PubSubName O nome do pub/sub dapr para enviar a mensagem. ✔️ ✔️
Tópico O nome do tópico dapr para enviar a mensagem. ✔️ ✔️
Conteúdo Obrigatório A mensagem que está sendo publicada. ✔️

Anotações

A DaprPublishOutput anotação permite que você tenha uma função acessando uma mensagem publicada.

Elemento Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
pubSubName O nome do pub/sub dapr para enviar a mensagem. ✔️ ✔️
tópico O nome do tópico dapr para enviar a mensagem. ✔️ ✔️
carga útil Obrigatório A mensagem que está sendo publicada. ✔️

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
pubsubname O nome do serviço de componente do editor. ✔️ ✔️
tópico O nome/identificador do tópico do editor. ✔️ ✔️
carga útil Obrigatório A mensagem que está sendo publicada. ✔️

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
pubsubname O nome do serviço de componente do editor. ✔️ ✔️
tópico O nome/identificador do tópico do editor. ✔️ ✔️
carga útil Obrigatório A mensagem que está sendo publicada. ✔️

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

Propriedade Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
pub_sub_name O nome do evento do editor. ✔️ ✔️
tópico O nome/identificador do tópico do editor. ✔️ ✔️
carga útil Obrigatório A mensagem que está sendo publicada. ✔️

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 de publicação do Dapr, comece configurando um componente de pub/sub dapr. Saiba mais sobre qual componente usar e como configurá-lo na documentação oficial do Dapr.

Para usar a opção daprPublish 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. Modifique seu arquivo local.setting.json com a seguinte configuração:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Próximas etapas

Saiba mais sobre a publicação e assinatura do Dapr.