Partager via


RedisPubSubTrigger pour Azure Functions

Redis propose une fonctionnalité de publication/d’abonnement qui permet d’envoyer des messages à Redis et de les diffuser aux abonnés.

Pour plus d’informations sur les déclencheurs et les liaisons Azure Cache pour Redis, l’extension Redis pour Azure Functions.

Étendue de la disponibilité des déclencheurs de fonctions

Type de déclencheur Redis managé par Azure Cache Azure pour Redis
Déclencheur de publication/d’abonnement Oui Oui

Important

Lorsque vous utilisez Azure Managed Redis ou les niveaux Entreprise de Azure Cache pour Redis, utilisez le port 10000 plutôt que le port 6380 ou 6379.

Avertissement

Ce déclencheur n’est pas pris en charge sur un plan de consommation , car Redis PubSub exige que les clients soient toujours à l’écoute active pour recevoir tous les messages. Pour les plans de consommation, votre fonction peut manquer certains messages publiés sur le canal.

Important

Le modèle Node.js v4 pour Functions n’est pas encore pris en charge par l’extension Azure Cache pour Redis. Pour plus d’informations sur le fonctionnement du modèle v4, reportez-vous au guide du développeur Azure Functions Node.js. Pour plus d’informations sur les différences entre v3 et v4, consultez le guide de migration.

Important

Le modèle Python v2 pour Functions n’est pas encore pris en charge par l’extension Azure Cache pour Redis. Pour plus d’informations sur le fonctionnement du modèle v2, consultez le guide du développeur Python sur Azure Functions.

Exemples

Modèle d’exécution Description
Modèle de worker isolé Le code de votre fonction s’exécute dans un processus Worker .NET distinct. Utilisez avec les versions prises en charge de .NET et .NET Framework. Pour plus d’informations, consultez Développer les fonctions de processus Worker isolé .NET.
Modèle in-process Le code de votre fonction s’exécute dans le même processus que le processus hôte Functions. Prend uniquement en charge les versions LTS (Long Term Support) de .NET. Pour plus d’informations, consultez Développer des fonctions de bibliothèque de classes .NET.

Important

Pour les fonctions .NET, il est recommandé d’utiliser le modèle de Worker isolé plutôt que le modèle in-process. Pour une comparaison des modèles worker in-process et isolés , consultez les différences entre le modèle worker isolé et le modèle in-process pour .NET sur Azure Functions.

Cet exemple écoute le canal pubsubTest.

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

Cet exemple écoute toutes les notifications d’espace de clés pour la clé 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);
        }
    }
}

Cet exemple écoute toutes les notifications keyevent pour la commande de suppression DEL.

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.");
        }
    }
}

Cet exemple écoute le canal pubsubTest.

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


Cet exemple écoute toutes les notifications d’espace de clés pour la clé 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);
    }
}

Cet exemple écoute toutes les notifications keyevent pour la commande de suppression DEL.

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

Cet exemple utilise le même index.js fichier, avec des données de liaison dans le fichier déterminant sur quel function.json canal le déclencheur se produit.

Voici le fichier index.js :

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

À partir de function.json:

Voici des données de liaison permettant d’écouter le canal pubsubTest.

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

Voici des données de liaison permettant d’écouter les notifications d’espace de clés pour la clé keyspaceTest.

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

Voici des données de liaison permettant d’écouter les notifications keyevent pour la commande de suppression DEL.

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

Cet exemple utilise le même run.ps1 fichier, avec des données de liaison dans le fichier déterminant sur quel function.json canal le déclencheur se produit.

Voici le fichier run.ps1 :

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

À partir de function.json:

Voici des données de liaison permettant d’écouter le canal pubsubTest.

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

Voici des données de liaison permettant d’écouter les notifications d’espace de clés pour la clé keyspaceTest.

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

Voici des données de liaison permettant d’écouter les notifications keyevent pour la commande de suppression DEL.

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

Le modèle de programmation Python v1 vous oblige à définir des liaisons dans un fichier function.json distinct dans le dossier de fonction. Pour plus d’informations, consultez le guide des développeurs Python.

Cet exemple utilise le même __init__.py fichier, avec des données de liaison dans le fichier déterminant sur quel function.json canal le déclencheur se produit.

Voici le fichier __init__.py :

import logging

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

À partir de function.json:

Voici des données de liaison permettant d’écouter le canal pubsubTest.

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

Voici des données de liaison permettant d’écouter les notifications d’espace de clés pour la clé keyspaceTest.

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

Voici des données de liaison permettant d’écouter les notifications keyevent pour la commande de suppression DEL.

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

Attributs

Paramètre Description Obligatoire Par défaut
Connection Nom du paramètre d’application qui contient le cache chaîne de connexion, par exemple :<cacheName>.redis.cache.windows.net:6380,password... Oui
Channel Le canal de publication/d’abonnement que le déclencheur doit écouter. Prend en charge les modèles de canal de style glob. Ce champ peut être résolu à l’aide de INameResolver. Oui

Annotations

Paramètre Description Obligatoire Par défaut
name Nom de la variable contenant la valeur retournée par la fonction. Oui
connection Nom du paramètre d’application qui contient le cache chaîne de connexion, par exemple :<cacheName>.redis.cache.windows.net:6380,password... Oui
channel Le canal de publication/d’abonnement que le déclencheur doit écouter. Prend en charge les modèles de canal de style glob. Oui

Configuration

Propriété function.json Description Obligatoire Par défaut
type Type de déclencher. Pour le sous-déclencheur pub, le type est redisPubSubTrigger. Oui
connection Nom du paramètre d’application qui contient le cache chaîne de connexion, par exemple :<cacheName>.redis.cache.windows.net:6380,password... Oui
channel Nom du sous-canal pub auquel il est abonné. Oui
pattern Valeur booléenne pour indiquer que le canal donné utilise la correspondance de modèle. Si pattern c’est vrai, le canal est traité comme un modèle glob-style au lieu d’un littéral. Oui
name Nom de la variable contenant la valeur retournée par la fonction. Oui
direction Cette propriété doit être définie sur in. Oui

Important

Le paramètre connection ne contient pas la chaîne de connexion du cache Redis elle-même. Au lieu de cela, il pointe vers le nom de la variable d’environnement qui contient la chaîne de connexion. De cette manière, l’application est plus sécurisée. Pour plus d’informations, consultez Chaîne de connexion Redis.

Utilisation

Redis propose une fonctionnalité de publication/d’abonnement qui permet d’envoyer des messages à Redis et de les diffuser aux abonnés. RedisPubSubTrigger permet de déclencher Azure Functions lors de l’activité de publication/d’abonnement. RedisPubSubTrigger s’abonne à un modèle de canal spécifique à l’aide de PSUBSCRIBE et expose les messages reçus sur ces canaux à la fonction.

Conditions préalables et limitations

  • le RedisPubSubTrigger n’est pas capable d’écouter les notifications d’espace de clés sur les caches cluster.
  • Les fonctions de niveau de base ne prennent pas en charge le déclenchement de notifications ou keyspace via keyevent le RedisPubSubTrigger.
  • RedisPubSubTrigger n’est pas pris en charge sur un plan de consommation, car Redis PubSub exige que les clients soient toujours activement à l’écoute pour recevoir tous les messages. Pour les plans de consommation, votre fonction peut manquer certains messages publiés sur le canal.
  • Les fonctions avec RedisPubSubTrigger ne doivent pas être mises à l’échelle sur plusieurs instances. Chaque instance écoute et traite chaque sous-message pub, ce qui entraîne un traitement en double.

Avertissement

Ce déclencheur n’est pas pris en charge sur un plan de consommation , car Redis PubSub exige que les clients soient toujours à l’écoute active pour recevoir tous les messages. Pour les plans de consommation, votre fonction peut manquer certains messages publiés sur le canal.

Déclenchement sur les notifications d’espace de clés

Redis propose un concept intégré appelé notifications d’espace de clés. Lorsqu’elle est activée, cette fonctionnalité publie des notifications d’un large éventail d’actions de cache sur un canal pub/sous-canal dédié. Les actions prises en charge incluent des actions qui affectent des clés spécifiques, appelées notifications d’espace de clés, et des commandes spécifiques, appelées notifications d’événement clé. Un large éventail d’actions Redis sont prises en charge, telles que SET, DEL et EXPIRE. La liste complète est présente dans la documentation notification de keyspace.

Les keyspace notifications et keyevent sont publiées avec la syntaxe suivante :

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

Étant donné que ces événements sont publiés sur les canaux pub/sub, le RedisPubSubTrigger est en mesure de les récupérer. Pour plus d’exemples, consultez la section RedisPubSubTrigger .

Important

Dans Azure Cache pour Redis, keyspace les événements doivent être activés avant la publication des notifications. Pour plus d’informations, consultez la Paramètres avancés.

Type Description
string Message de canal sérialisé en tant que JSON (encodé en UTF-8 pour les types d’octets) au format suivant.
Custom Le déclencheur utilise Json.NET sérialisation pour mapper le message du canal dans le type personnalisé donné.

Format de chaîne JSON

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

Type Description
string Message de canal sérialisé en tant que JSON (encodé en UTF-8 pour les types d’octets) au format suivant.
Custom Le déclencheur utilise la sérialisation Json.NET pour mapper le message du canal d’un string à un type personnalisé.
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}