Compartir vía


RedisPubSubTrigger para Azure Functions

Redis presenta la función de publicación y suscripción que permite enviar mensajes a Redis y difundirlos a los suscriptores.

Para más información sobre los desencadenadores y enlaces de Azure Cache for Redis, la extensión redis para Azure Functions.

Ámbito de disponibilidad para desencadenadores de funciones

Tipo de desencadenador Azure Managed Redis Azure Cache for Redis
Desencadenador Pub/Sub

Importante

Al usar Azure Managed Redis o los niveles Enterprise de Azure Cache for Redis, use el puerto 10000 en lugar del puerto 6380 o 6379.

Advertencia

Este desencadenador no se admite en un plan de consumo porque Redis PubSub requiere que los clientes siempre escuchen activamente para recibir todos los mensajes. En el caso de los planes de consumo, es posible que la función pierda determinados mensajes publicados en el canal.

Importante

El modelo de Node.js v4 para Functions aún no es compatible con la extensión azure Cache for Redis. Para más detalles acerca de cómo funciona el modelo v4, consulte la Guía para desarrolladores de Node.js de Azure Functions. Para obtener más información acerca de las diferencias entre v3 y v4, consulte la Guía de migración.

Importante

El modelo de Python v2 para Functions aún no es compatible con la extensión Azure Cache for Redis. Para más información sobre cómo funciona el modelo v2, consulte la Guía para desarrolladores de Python de Azure Functions.

Ejemplos

Modelo de ejecución Descripción
Modelo de trabajo aislado El código de función se ejecuta en un proceso de trabajo de .NET independiente. Se usa con versiones compatibles de .NET y .NET Framework. Para obtener más información, consulte Desarrollo de funciones de procesos de trabajo aislados en .NET.
Modelo de proceso El código de función se ejecuta en el mismo proceso que el proceso de host de Functions. Solo admite versiones de .NET de compatibilidad a largo plazo (LTS). Para obtener más información, consulte Desarrollo de funciones de la biblioteca de clases de .NET.

Importante

En el caso de las funciones de .NET, se recomienda usar el modelo de trabajo aislado en lugar del modelo en proceso. Para obtener una comparación de los modelos de trabajo en proceso y aislados, consulte las diferencias entre el modelo de trabajo aislado y el modelo en proceso para .NET en Azure Functions.

Este ejemplo escucha el 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);
        }
    }
}

En este ejemplo se escuchan las notificaciones de espacio de claves para la clave 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);
        }
    }
}

En este ejemplo se escuchan las keyevent notificaciones para el comando de eliminación 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.");
        }
    }
}

Este ejemplo escucha el 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);
    }
}


En este ejemplo se escuchan las notificaciones de espacio de claves para la clave 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);
    }
}

En este ejemplo se escuchan las keyevent notificaciones para el comando de eliminación 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);
    }
}

Este ejemplo usa el mismo archivo index.js, con datos de enlace en el archivo function.json que determinan en qué canal se produce el desencadenador.

Este es el archivo index.js:

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

Desde function.json:

Estos son los datos de enlace para escuchar el canal pubsubTest.

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

Estos son los datos de enlace para escuchar las notificaciones del espacio de claves de la clave keyspaceTest.

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

Estos son los datos de enlace para escuchar las notificaciones keyevent para el comando de eliminación DEL.

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

Este ejemplo usa el mismo archivo run.ps1, con datos de enlace en el archivo function.json que determinan en qué canal se produce el desencadenador.

Este es el archivo run.ps1:

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

Desde function.json:

Estos son los datos de enlace para escuchar el canal pubsubTest.

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

Estos son los datos de enlace para escuchar las notificaciones del espacio de claves de la clave keyspaceTest.

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

Estos son los datos de enlace para escuchar las notificaciones keyevent para el comando de eliminación DEL.

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

El modelo de programación de Python v1 requiere que defina enlaces en un archivo function.json independiente en la carpeta de funciones. Para más información, consulte la Guía para desarrolladores de Python.

Este ejemplo usa el mismo archivo __init__.py, con datos de enlace en el archivo function.json que determinan en qué canal se produce el desencadenador.

Este es el archivo __init__.py:

import logging

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

Desde function.json:

Estos son los datos de enlace para escuchar el canal pubsubTest.

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

Estos son los datos de enlace para escuchar las notificaciones del espacio de claves de la clave keyspaceTest.

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

Estos son los datos de enlace para escuchar las notificaciones keyevent para el comando de eliminación DEL.

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

Atributos

Parámetro Descripción Necesario Valor predeterminado
Connection Nombre de la configuración de la aplicación que contiene el cadena de conexión de caché, como:<cacheName>.redis.cache.windows.net:6380,password...
Channel El canal secundario de Pub que debe escuchar el desencadenador. Admite patrones de canal de estilo global. Este campo se puede resolver mediante INameResolver.

anotaciones

Parámetro Descripción Necesario Valor predeterminado
name Nombre de la variable que contiene el valor devuelto por la función.
connection Nombre de la configuración de la aplicación que contiene el cadena de conexión de caché, como:<cacheName>.redis.cache.windows.net:6380,password...
channel El canal secundario de Pub que debe escuchar el desencadenador. Admite patrones de canal de estilo global.

Configuración

Propiedad de function.json Descripción Necesario Valor predeterminado
type Tipo de desencadenador. Para el desencadenador pub sub, el tipo es redisPubSubTrigger.
connection Nombre de la configuración de la aplicación que contiene el cadena de conexión de caché, como:<cacheName>.redis.cache.windows.net:6380,password...
channel Nombre del subcanal pub al que se está suscrito.
pattern Valor booleano para indicar que el canal dado usa coincidencias de patrones. Si pattern es true, el canal se trata como un patrón de estilo global en lugar de como un literal.
name Nombre de la variable que contiene el valor devuelto por la función.
direction Se debe establecer en in.

Importante

El parámetro connection no contiene la propia cadena de conexión de caché de Redis. En su lugar, apunta al nombre de la variable de entorno que contiene la cadena de conexión. Esto hace que la aplicación sea más segura. Para obtener más información, consulte Cadena de conexión de Redis.

Uso

Redis presenta la función de publicación y suscripción que permite enviar mensajes a Redis y difundirlos a los suscriptores. RedisPubSubTrigger permite que las funciones de Azure se activen en la actividad de Publicación/Suscripción. RedisPubSubTrigger se suscribe a un patrón de canal específico mediante PSUBSCRIBE y expone los mensajes recibidos en esos canales a la función.

Requisitos previos y limitaciones

  • RedisPubSubTrigger no es capaz de escuchar notificaciones de espacio de claves en cachés en clúster.
  • Las funciones de nivel básico no admiten el desencadenamiento en las notificaciones keyspace o keyevent a través de RedisPubSubTrigger.
  • RedisPubSubTrigger no se admite en un plan de consumo porque PubSub de Redis requiere que los clientes siempre escuchen activamente para recibir todos los mensajes. En el caso de los planes de consumo, es posible que la función pierda determinados mensajes publicados en el canal.
  • Las funciones con RedisPubSubTrigger no se deben escalar horizontalmente a varias instancias. Cada instancia escucha y procesa cada sub mensaje pub, lo que da lugar a un procesamiento duplicado.

Advertencia

Este desencadenador no se admite en un plan de consumo porque Redis PubSub requiere que los clientes siempre escuchen activamente para recibir todos los mensajes. En el caso de los planes de consumo, es posible que la función pierda determinados mensajes publicados en el canal.

Desencadenamiento en notificaciones de espacios de claves

Redis ofrece un concepto integrado denominado notificaciones de espacio de claves. Cuando se habilita, esta característica publica notificaciones de una amplia gama de acciones de caché en un canal de publicación y subscripción dedicado. Las acciones admitidas incluyen acciones que afectan a claves específicas, llamadas notificaciones de espacios de claves y comandos específicos, llamados notificaciones de eventos de claves. Se admite una gran variedad de acciones de Redis, como SET, DEL y EXPIRE. Puede encontrar la lista completa en la documentación sobre las notificaciones de espacios de claves.

Las notificaciones keyspace y keyevent se publican con la sintaxis siguiente:

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

Dado que estos eventos se publican en canales de publicación y subscripción, RedisPubSubTrigger es capaz de recogerlos. Consulte la sección RedisPubSubTrigger para obtener más ejemplos.

Importante

En Azure Cache for Redis, los eventos keyspace deben habilitarse antes de que se publiquen las notificaciones. Para obtener más información, consulte la Configuración avanzada.

Tipo Descripción
string El mensaje de canal serializado como JSON (codificado con UTF-8 para tipos de bytes) en el formato siguiente.
Custom El desencadenador usa Json.NET serialización para asignar el mensaje desde el canal al tipo personalizado especificado.

Formato de cadena JSON

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

Tipo Descripción
string El mensaje de canal serializado como JSON (codificado con UTF-8 para tipos de bytes) en el formato siguiente.
Custom El desencadenador utiliza la serialización Json.NET para asignar el mensaje del canal de string a un tipo personalizado.
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}