Condividi tramite


Associazione di output di pubblicazione Dapr per Funzioni di Azure

L'associazione di output di pubblicazione Dapr consente di pubblicare un messaggio in un argomento Dapr durante l'esecuzione di una funzione.

Per informazioni sull'installazione e sulla configurazione dell'estensione Dapr, vedere panoramica dell'estensione Dapr.

Esempio

È possibile creare una funzione C# usando una delle modalità C# seguenti:

Modello di esecuzione Descrizione
Modello di lavoro isolato Il codice della funzione viene eseguito in un processo di lavoro .NET separato. Usare con le versioni supportate di .NET e .NET Framework. Per altre informazioni, vedere Sviluppare funzioni di processo di lavoro isolato .NET.
Modello di processo Il codice della funzione viene eseguito nello stesso processo del processo host di Funzioni. Supporta solo versioni LTS (Long Term Support) di .NET. Per altre informazioni, vedere Sviluppare funzioni della libreria di classi .NET.

Nell'esempio seguente viene illustrato l'uso di un'associazione di output di pubblicazione Dapr per eseguire un'operazione di pubblicazione Dapr in un componente pub/sub e in un argomento.

[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);
}

Nell'esempio seguente viene creata una funzione "TransferEventBetweenTopics" usando l'associazione DaprPublishOutput con un 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.");
}

Nell'esempio seguente, l'associazione di output di pubblicazione Dapr viene associata a un trigger HTTP registrato dall'oggetto 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 };
    }
});

Gli esempi seguenti illustrano i trigger Dapr in un file function.json e nel codice di PowerShell che usano tali associazioni.

Ecco il file function.json per daprPublish:

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

Per altre informazioni sulle proprietà dei file function.json, vedere la sezione configurazione.

Nel codice:

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

L'esempio seguente mostra un'associazione di output di pubblicazione Dapr, che usa il modello di programmazione Python v2. Per usare daprPublish nel codice dell'app per le funzioni 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'))

Attributi

Nel modello In-process usare il DaprPublish per definire un'associazione di output di pubblicazione Dapr, che supporta questi parametri:

Proprietà di function.json Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
PubSubName Nome del pub/sub Dapr per inviare il messaggio. ✔️ ✔️
Argomento Nome dell'argomento Dapr da inviare il messaggio. ✔️ ✔️
Payload Obbligatorio. Messaggio in corso di pubblicazione. ✔️

Annotazioni

L'annotazione DaprPublishOutput consente di avere accesso di funzione a un messaggio pubblicato.

Elemento Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
pubSubName Nome del pub/sub Dapr per inviare il messaggio. ✔️ ✔️
topic Nome dell'argomento Dapr da inviare il messaggio. ✔️ ✔️
payload Obbligatorio. Messaggio in corso di pubblicazione. ✔️

Impostazione

Nella tabella seguente vengono illustrate le proprietà di configurazione dell'associazione impostate nel codice.

Proprietà Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
pubsubname Nome del servizio componente del server di pubblicazione. ✔️ ✔️
topic Nome/identificatore dell'argomento del server di pubblicazione. ✔️ ✔️
payload Obbligatorio. Messaggio in corso di pubblicazione. ✔️

Nella tabella seguente sono illustrate le proprietà di configurazione dell'associazione impostate nel file function.json.

Proprietà di function.json Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
pubsubname Nome del servizio componente del server di pubblicazione. ✔️ ✔️
topic Nome/identificatore dell'argomento del server di pubblicazione. ✔️ ✔️
payload Obbligatorio. Messaggio in corso di pubblicazione. ✔️

La tabella seguente illustra le proprietà di configurazione dell'associazione per @dapp.dapr_publish_output impostate nel codice Python.

Proprietà Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
pub_sub_name Nome dell'evento del server di pubblicazione. ✔️ ✔️
topic Nome/identificatore dell'argomento del server di pubblicazione. ✔️ ✔️
payload Obbligatorio. Messaggio in corso di pubblicazione. ✔️

Se le proprietà sono definite sia in Attributi che in RequestBody, la priorità viene assegnata ai dati forniti in RequestBody.

Per esempi completi, vedere la sezione di esempio.

Utilizzo

Per usare l'associazione di output di pubblicazione Dapr, iniziare configurando un componente pub/sub Dapr. Per altre informazioni sul componente da usare e su come configurarlo, vedere la documentazione ufficiale di Dapr.

Per usare daprPublish in Python v2, configurare il progetto con le dipendenze corrette.

  1. Creare e attivare un ambiente virtuale.

  2. Nel file requirements.text aggiungere la riga seguente:

    azure-functions==1.18.0b3
    
  3. Nel terminale installare la libreria Python.

    pip install -r .\requirements.txt
    
  4. Modificare il file local.setting.json con la configurazione seguente:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Passaggi successivi

Altre informazioni sulla pubblicazione e la sottoscrizione di Dapr.