Freigeben über


RedisPubSubTrigger für Azure Functions

Mit dem Redis-Feature zum Veröffentlichen/Abonnieren (Pub/Sub) können Nachrichten an Redis gesendet und an Abonnenten weitergeleitet werden.

Weitere Informationen zu Azure Cache für Redis-Trigger und -Bindungen, Redis-Erweiterung für Azure-Funktionen.

Verfügbarkeitsbereich für Funktionstrigger

Triggertyp Azure Managed Redis Azure Cache for Redis
Pub/Sub-Trigger Ja Ja

Wichtig

Wenn Sie Azure Managed Redis oder die Enterprise-Ebenen von Azure Cache für Redis verwenden, verwenden Sie Port 10000 anstelle von Port 6380 oder 6379.

Warnung

Dieser Trigger wird für einen Verbrauchsplan nicht unterstützt, da Redis PubSub erfordert, dass Clients immer aktiv lauschen, um alle Nachrichten zu empfangen. Bei Verbrauchsplänen kann Ihre Funktion bestimmte Nachrichten verpassen, die im Kanal veröffentlicht wurden.

Wichtig

Das Node.js v4-Modell für Funktionen wird von der Azure Cache for Redis-Erweiterung noch nicht unterstützt. Weitere Informationen zur Funktionsweise des v4-Modells finden Sie im Azure Functions Node.js-Entwicklerhandbuch. Weitere Informationen zu den Unterschieden zwischen v3 und v4 finden Sie im Migrationshandbuch.

Wichtig

Das Python v2-Modell für Funktionen wird von der Azure Cache for Redis-Erweiterung noch nicht unterstützt. Weitere Informationen zur Funktionsweise des v2-Modells finden Sie im Azure Functions Python-Entwicklerhandbuch.

Beispiele

Ausführungsmodell Beschreibung
Isoliertes Workermodell Ihr Funktionscode wird in einem separaten .NET-Workerprozess ausgeführt. Verwenden Sie dazu unterstützte Versionen von .NET und .NET Framework. Weitere Informationen finden Sie unter Entwickeln von isolierten .NET-Workerprozessfunktionen.
In-Process-Modell Ihr Funktionscode wird im gleichen Prozess wie der Functions-Hostprozess ausgeführt. Unterstützt nur LTS-Versionen (Long Term Support) von .NET. Weitere Informationen finden Sie unter Entwickeln von .NET-Klassenbibliotheksfunktionen.

Wichtig

Für .NET-Funktionen wird die Verwendung des isolierten Workermodells gegenüber dem In-Process-Modell empfohlen. Einen Vergleich der In-Process - und isolierten Workermodelle finden Sie unter den Unterschieden zwischen dem isolierten Workermodell und dem Prozessmodell für .NET in Azure Functions.

In diesem Beispiel wird dem Kanal pubsubTest gelauscht.

using Microsoft.Extensions.Logging;

namespace Microsoft.Azure.Functions.Worker.Extensions.Redis.Samples.RedisPubSubTrigger
{
    internal class SimplePubSubTrigger
    {
        private readonly ILogger<SimplePubSubTrigger> logger;

        public SimplePubSubTrigger(ILogger<SimplePubSubTrigger> logger)
        {
            this.logger = logger;
        }

        [Function(nameof(SimplePubSubTrigger))]
        public void Run(
            [RedisPubSubTrigger(Common.connectionStringSetting, "pubsubTest")] string message)
        {
            logger.LogInformation(message);
        }
    }
}

Dieses Beispiel lauscht auf alle Keyspacebenachrichtigungen für den Schlüssel keyspaceTest.

using Microsoft.Extensions.Logging;

namespace Microsoft.Azure.Functions.Worker.Extensions.Redis.Samples.RedisPubSubTrigger
{
    internal class KeyspaceTrigger
    {
        private readonly ILogger<KeyspaceTrigger> logger;

        public KeyspaceTrigger(ILogger<KeyspaceTrigger> logger)
        {
            this.logger = logger;
        }

        [Function(nameof(KeyspaceTrigger))]
        public void Run(
            [RedisPubSubTrigger(Common.connectionStringSetting, "__keyspace@0__:keyspaceTest")] string message)
        {
            logger.LogInformation(message);
        }
    }
}

Dieses Beispiel lauscht auf alle DEL-Benachrichtigungen für den Löschbefehl keyevent.

using Microsoft.Extensions.Logging;

namespace Microsoft.Azure.Functions.Worker.Extensions.Redis.Samples.RedisPubSubTrigger
{
    internal class KeyeventTrigger
    {
        private readonly ILogger<KeyeventTrigger> logger;

        public KeyeventTrigger(ILogger<KeyeventTrigger> logger)
        {
            this.logger = logger;
        }

        [Function(nameof(KeyeventTrigger))]
        public void Run(
            [RedisPubSubTrigger(Common.connectionStringSetting, "__keyevent@0__:del")] string message)
        {
            logger.LogInformation($"Key '{message}' deleted.");
        }
    }
}

In diesem Beispiel wird dem Kanal pubsubTest gelauscht.

package com.function.RedisPubSubTrigger;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.redis.annotation.*;

public class SimplePubSubTrigger {
    @FunctionName("SimplePubSubTrigger")
    public void run(
            @RedisPubSubTrigger(
                name = "req",
                connection = "redisConnectionString",
                channel = "pubsubTest",
                pattern = false)
                String message,
            final ExecutionContext context) {
            context.getLogger().info(message);
    }
}


Dieses Beispiel lauscht auf alle Keyspacebenachrichtigungen für den Schlüssel myKey.

package com.function.RedisPubSubTrigger;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.redis.annotation.*;

public class KeyspaceTrigger {
    @FunctionName("KeyspaceTrigger")
    public void run(
            @RedisPubSubTrigger(
                name = "req",
                connection = "redisConnectionString",
                channel = "__keyspace@0__:keyspaceTest",
                pattern = false)
                String message,
            final ExecutionContext context) {
            context.getLogger().info(message);
    }
}

Dieses Beispiel lauscht auf alle DEL-Benachrichtigungen für den Löschbefehl keyevent.

package com.function.RedisPubSubTrigger;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.redis.annotation.*;

public class KeyeventTrigger {
    @FunctionName("KeyeventTrigger")
    public void run(
            @RedisPubSubTrigger(
                name = "req",
                connection = "redisConnectionString",
                channel = "__keyevent@0__:del",
                pattern = false)
                String message,
            final ExecutionContext context) {
            context.getLogger().info(message);
    }
}

Dieses Beispiel verwendet dieselbe index.js-Datei, wobei die Bindungsdaten in der function.json-Datei bestimmen, in welchem Kanal der Trigger auftritt.

Hier sehen Sie die Datei index.js:

module.exports = async function (context, message) {
    context.log(message);
}

Von function.json:

Hier finden Sie die Bindungsdaten, um dem Kanal pubsubTest zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "pubsubTest",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "index.js"
}

Hier finden Sie die Bindungsdaten, um den Keyspacebenachrichtigungen für den Schlüssel keyspaceTest zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyspace@0__:keyspaceTest",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "index.js"
}

Hier finden Sie die Bindungsdaten, um den keyevent-Benachrichtigungen für den Löschbefehl DEL zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyevent@0__:del",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "index.js"
}

Dieses Beispiel verwendet dieselbe run.ps1-Datei, wobei die Bindungsdaten in der function.json-Datei bestimmen, in welchem Kanal der Trigger auftritt.

Hier sehen Sie die Datei run.ps1:

param($message, $TriggerMetadata)
Write-Host $message

Von function.json:

Hier finden Sie die Bindungsdaten, um dem Kanal pubsubTest zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "pubsubTest",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "run.ps1"
}

Hier finden Sie die Bindungsdaten, um den Keyspacebenachrichtigungen für den Schlüssel keyspaceTest zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyspace@0__:keyspaceTest",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "run.ps1"
}

Hier finden Sie die Bindungsdaten, um den keyevent-Benachrichtigungen für den Löschbefehl DEL zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyevent@0__:del",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "run.ps1"
}

Für das Python v1-Programmiermodell müssen Sie Bindungen in einer separaten function.json-Datei im Funktionsordner definieren. Weitere Informationen finden Sie im Python Developer-Leitfaden.

Dieses Beispiel verwendet dieselbe __init__.py-Datei, wobei die Bindungsdaten in der function.json-Datei bestimmen, in welchem Kanal der Trigger auftritt.

Hier sehen Sie die Datei __init__.py:

import logging

def main(message: str):
    logging.info(message)

Von function.json:

Hier finden Sie die Bindungsdaten, um dem Kanal pubsubTest zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "pubsubTest",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "__init__.py"
}

Hier finden Sie die Bindungsdaten, um den Keyspacebenachrichtigungen für den Schlüssel keyspaceTest zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyspace@0__:keyspaceTest",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "__init__.py"
}

Hier finden Sie die Bindungsdaten, um den keyevent-Benachrichtigungen für den Löschbefehl DEL zu lauschen:

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyevent@0__:del",
      "pattern": false,
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "__init__.py"
}

Attribute

Parameter Beschreibung des Dataflows Erforderlich Standard
Connection Der Name der Anwendungseinstellung, die den Cache Verbindungszeichenfolge enthält, z. B.:<cacheName>.redis.cache.windows.net:6380,password... Ja
Channel Der Name des Pub/Sub-Kanals, dem der Trigger lauschen soll. Globkanalmuster werden unterstützt. Dieses Feld kann mithilfe von INameResolver aufgelöst werden. Ja

Anmerkungen

Parameter Beschreibung des Dataflows Erforderlich Standard
name Der Name der Variablen, die den von der Funktion zurückgegebenen Wert enthält Ja
connection Der Name der Anwendungseinstellung, die den Cache Verbindungszeichenfolge enthält, z. B.:<cacheName>.redis.cache.windows.net:6380,password... Ja
channel Der Name des Pub/Sub-Kanals, dem der Trigger lauschen soll. Globkanalmuster werden unterstützt. Ja

Konfiguration

Eigenschaft von „function.json“ Beschreibung Erforderlich Standard
type Der Triggertyp, Für den Pub-Sub-Trigger lautet redisPubSubTriggerder Typ . Ja
connection Der Name der Anwendungseinstellung, die den Cache Verbindungszeichenfolge enthält, z. B.:<cacheName>.redis.cache.windows.net:6380,password... Ja
channel Name des pub-Unterkanals, der abonniert wird. Ja
pattern Ein boolescher Wert, der angibt, dass der angegebene Kanal Musterabgleich verwendet. Wenn pattern dies der Fall ist, wird der Kanal wie ein Glob-Style-Muster anstelle eines Literals behandelt. Ja
name Der Name der Variablen, die den von der Funktion zurückgegebenen Wert enthält Ja
direction Muss auf in festgelegt sein. Ja

Wichtig

Der connection-Parameter enthält nicht die Redis Cache-Verbindungszeichenfolge selbst. Stattdessen verweist er auf den Namen der Umgebungsvariablen, die die Verbindungszeichenfolge enthält. Dadurch wird die Anwendung sicherer. Weitere Informationen finden Sie unter Redis-Verbindungszeichenfolgen.

Verbrauch

Mit dem Redis-Feature zum Veröffentlichen/Abonnieren (Pub/Sub) können Nachrichten an Redis gesendet und an Abonnenten weitergeleitet werden. RedisPubSubTrigger ermöglicht, dass Azure-Funktionen bei Pub/Sub-Aktivitäten ausgelöst werden. RedisPubSubTrigger abonniert ein bestimmtes Kanalmuster mithilfe von PSUBSCRIBE und leitet die auf diesen Kanälen empfangenen Nachrichten an die Funktion weiter.

Voraussetzungen und Einschränkungen

  • Der RedisPubSubTrigger ist nicht in der Lage, Keyspace-Benachrichtigungen in gruppierten Caches zu lauschen.
  • Grundlegende Ebenenfunktionen unterstützen nicht das Auslösen von keyspace- oder keyevent-Benachrichtigungen über den RedisPubSubTrigger.
  • RedisPubSubTrigger wird für einen Verbrauchsplan nicht unterstützt, da der Pub/Sub-Ansatz in Redis erfordert, dass Clients immer aktiv lauschen, um alle Nachrichten zu empfangen. Bei Verbrauchsplänen kann Ihre Funktion bestimmte Nachrichten verpassen, die im Kanal veröffentlicht wurden.
  • Funktionen mit RedisPubSubTrigger sollten nicht auf mehrere Instanzen aufskaliert werden. Jede Instanz überwacht und verarbeitet jede Pub-Unternachricht, was zu doppelter Verarbeitung führt.

Warnung

Dieser Trigger wird für einen Verbrauchsplan nicht unterstützt, da Redis PubSub erfordert, dass Clients immer aktiv lauschen, um alle Nachrichten zu empfangen. Bei Verbrauchsplänen kann Ihre Funktion bestimmte Nachrichten verpassen, die im Kanal veröffentlicht wurden.

Auslösen von Keyspace-Benachrichtigungen

Redis bietet ein integriertes Konzept namens Keyspace-Benachrichtigungen. Wenn diese Funktion aktiviert ist, werden Benachrichtigungen zu einer Vielzahl von Cacheaktionen an einen dedizierten Pub-/Subkanal veröffentlicht. Zu den unterstützten Aktionen gehören Aktionen, die sich auf bestimmte Schlüssel auswirken, sogenannte Keyspace-Benachrichtigungen, und bestimmte Befehle, sogenannte Keyevent-Benachrichtigungen. Es wird eine Vielzahl von Redis-Aktionen unterstützt, z. B. SET, DEL und EXPIRE. Die vollständige Liste finden Sie in der Dokumentation zu Keyspace-Benachrichtigungen.

Die keyspace- und keyevent-Benachrichtigungen werden mit der folgenden Syntax veröffentlicht:

PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>

Da diese Ereignisse auf Pub-/Unterkanälen veröffentlicht werden, können sie von RedisPubSubTrigger aufgenommen werden. Weitere Beispiele finden Sie im Abschnitt RedisPubSubTrigger.

Wichtig

In Azure Cache for Redis müssen keyspace-Ereignisse aktiviert werden, bevor Benachrichtigungen veröffentlicht werden. Weitere Informationen finden Sie unter Erweiterte Einstellungen.

Typ Beschreibung
string Die Kanalnachricht serialisiert als JSON (UTF-8-codiert für Bytetypen) im folgenden Format.
Custom Der Trigger verwendet Json.NET Serialisierung, um die Nachricht aus dem Kanal dem angegebenen benutzerdefinierten Typ zuzuordnen.

JSON-Zeichenfolgenformat

{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}

Typ Beschreibung
string Die Kanalnachricht serialisiert als JSON (UTF-8-codiert für Bytetypen) im folgenden Format.
Custom Der Trigger verwendet die Json.NET-Serialisierung, um die Nachricht aus dem Kanal (zunächst ein string-Typ) einem benutzerdefinierten Typ zuzuordnen.
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}