Associações de saída de publicação do Dapr no Azure Functions

A associação de saída de publicação do Dapr permite que você publique uma mensagem em um tópico do 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, consulte 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 de uma associação de saída de publicação do Dapr para executar uma operação de publicação do 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 função "TransferEventBetweenTopics" usando a associação DaprPublishOutput 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 de Dapr é emparelhada com um gatilho HTTP, que é registrado pelo objeto app:

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 de publicação do Dapr, que usa o modelo de programação do Python v2. Para usar daprPublish 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="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 DaprPublish para definir uma associação de saída de publicação do Dapr, que dê suporte a estes 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 do Dapr para enviar a mensagem. ✔️ ✔️
Tópico O nome do tópico do Dapr para enviar a mensagem. ✔️ ✔️
Payload Obrigatório. A mensagem que está sendo publicada. ✔️

Anotações

A anotação DaprPublishOutput 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 do Dapr para enviar a mensagem. ✔️ ✔️
topic O nome do tópico do Dapr para enviar a mensagem. ✔️ ✔️
payload 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 publicador. ✔️ ✔️
topic O nome/identificador do tópico do publicador. ✔️ ✔️
payload 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 publicador. ✔️ ✔️
topic O nome/identificador do tópico do publicador. ✔️ ✔️
payload 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 publicador. ✔️ ✔️
topic O nome/identificador do tópico do publicador. ✔️ ✔️
payload 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 publicar do Dapr, comece configurando um componente de pub/sub do 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. Altere o arquivo local.setting.json com a configuração a seguir:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Próximas etapas

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