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.

Example

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

Execution model Description
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.
In-process model 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 };
    }
});

The following examples show Dapr triggers in a function.json file and PowerShell code that uses those bindings.

Here's the function.json file for daprPublish:

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

For more information about function.json file properties, see the Configuration section.

In code:

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'))

Attributes

In the in-process model, use the DaprPublish to define a Dapr publish output binding, which supports these parameters:

function.json property Description 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. ✔️ ✔️
Topic O nome do tópico dapr para enviar a mensagem. ✔️ ✔️
Payload Required. A mensagem que está sendo publicada. ✔️

Annotations

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

Element Description 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. ✔️ ✔️
topic O nome do tópico dapr para enviar a mensagem. ✔️ ✔️
payload Required. A mensagem que está sendo publicada. ✔️

Configuration

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

Property Description Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
pubsubname O nome do serviço de componente do editor. ✔️ ✔️
topic O nome/identificador do tópico do editor. ✔️ ✔️
payload Required. A mensagem que está sendo publicada. ✔️

The following table explains the binding configuration properties that you set in the function.json file.

function.json property Description Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
pubsubname O nome do serviço de componente do editor. ✔️ ✔️
topic O nome/identificador do tópico do editor. ✔️ ✔️
payload Required. 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.

Property Description Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
pub_sub_name O nome do evento do editor. ✔️ ✔️
topic O nome/identificador do tópico do editor. ✔️ ✔️
payload Required. 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.

See the Example section for complete examples.

Usage

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
    

Next steps

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