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
Nivel | Básico | Estándar, Premium | Enterprise o Enterprise Flash |
---|---|---|---|
Desencadenador Pub/Sub | Sí | Sí | Sí |
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... |
Sí | |
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 . |
Sí |
anotaciones
Parámetro | Descripción | Necesario | Valor predeterminado |
---|---|---|---|
name |
Nombre de la variable que contiene el valor devuelto por la función. | Sí | |
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... |
Sí | |
channel |
El canal secundario de Pub que debe escuchar el desencadenador. Admite patrones de canal de estilo global. | Sí |
Configuración
Propiedad de function.json | Descripción | Necesario | Valor predeterminado |
---|---|---|---|
type |
Tipo de desencadenador. Para el desencadenador pub sub, el tipo es redisPubSubTrigger . |
Sí | |
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... |
Sí | |
channel |
Nombre del subcanal pub al que se está suscrito. | Sí | |
pattern |
Valor booleano para indicar que el canal determinado usa el cálculo matemático de patrones. Si pattern es true, el canal se trata como un patrón de estilo global en lugar de como un literal. |
Sí | |
name |
Nombre de la variable que contiene el valor devuelto por la función. | Sí | |
direction |
Se debe establecer en in . |
Sí |
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
okeyevent
a través deRedisPubSubTrigger
. 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"
}