RedisPubSubTrigger per Funzioni di Azure
Redis offre funzionalità di pubblicazione/sottoscrizione che consente l'invio di messaggi a Redis e la trasmissione ai sottoscrittori.
Per altre informazioni sui trigger e le associazioni di cache di Azure per Redis, Estensione Redis per Funzioni di Azure.
Ambito della disponibilità per i trigger di funzioni
Tipo di trigger | Redis gestito di Azure | Cache Redis di Azure |
---|---|---|
Pub/Sub Trigger | Sì | Sì |
Importante
Quando si usano Redis gestiti di Azure o i livelli Enterprise di cache di Azure per Redis, usare la porta 10000 anziché la porta 6380 o 6379.
Avviso
Questo trigger non è supportato in un piano a consumo perché Redis PubSub richiede che i client siano sempre in ascolto attivo per ricevere tutti i messaggi. Per i piani a consumo, la funzione potrebbe perdere determinati messaggi pubblicati nel canale.
Importante
Il modello Node.js v4 per Funzioni non è ancora supportato dall'estensione cache di Azure per Redis. Per altre informazioni sul funzionamento del modello v4, vedere la guida per gli sviluppatori di Node.js per Funzioni di Azure. Altre informazioni sulle differenze tra i modelli v3 e v4 sono disponibili nella guida alla migrazione.
Importante
Il modello Python v2 per Funzioni non è ancora supportato dall'estensione cache di Azure per Redis. Per altre informazioni sul funzionamento del modello v2, vedere la guida per gli sviluppatori di Python per Funzioni di Azure.
Esempi
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. |
Importante
Per le funzioni .NET, è consigliabile usare il modello di lavoro isolato nel modello di In-Process. Per un confronto tra i modelli di lavoro in-process e isolati, vedere le differenze tra il modello di lavoro isolato e il modello in-process per .NET in Funzioni di Azure.
Questo esempio è in ascolto del canale 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);
}
}
}
Questo esempio è in ascolto di eventuali notifiche di keyspace per la chiave 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);
}
}
}
In questo esempio vengono ascoltate le keyevent
notifiche per il comando DEL
delete .
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.");
}
}
}
Questo esempio è in ascolto del canale 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);
}
}
Questo esempio è in ascolto di eventuali notifiche di keyspace per la chiave 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);
}
}
In questo esempio vengono ascoltate le keyevent
notifiche per il comando DEL
delete .
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);
}
}
In questo esempio viene usato lo stesso index.js
file, con i dati di associazione nel function.json
file che determinano il canale in cui si verifica il trigger.
Ecco il index.js
file:
module.exports = async function (context, message) {
context.log(message);
}
Da function.json
:
Ecco i dati di associazione per ascoltare il canale pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Ecco i dati di associazione per ascoltare le notifiche di keyspace per la chiave keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Ecco i dati di associazione per ascoltare keyevent
le notifiche per il comando DEL
delete .
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
In questo esempio viene usato lo stesso run.ps1
file, con i dati di associazione nel function.json
file che determinano il canale in cui si verifica il trigger.
Ecco il run.ps1
file:
param($message, $TriggerMetadata)
Write-Host $message
Da function.json
:
Ecco i dati di associazione per ascoltare il canale pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Ecco i dati di associazione per ascoltare le notifiche di keyspace per la chiave keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Ecco i dati di associazione per ascoltare keyevent
le notifiche per il comando DEL
delete .
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Il modello di programmazione Python v1 richiede di definire associazioni in un file di function.json separato nella cartella della funzione. Per altre informazioni, vedere la Guida per sviluppatori Python.
In questo esempio viene usato lo stesso __init__.py
file, con i dati di associazione nel function.json
file che determinano il canale in cui si verifica il trigger.
Ecco il __init__.py
file:
import logging
def main(message: str):
logging.info(message)
Da function.json
:
Ecco i dati di associazione per ascoltare il canale pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Ecco i dati di associazione per ascoltare le notifiche di keyspace per la chiave keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Ecco i dati di associazione per ascoltare keyevent
le notifiche per il comando DEL
delete .
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Attributi
Parametro | Descrizione | Richiesto | Valore predefinito |
---|---|---|---|
Connection |
Nome dell'impostazione dell'applicazione che contiene la cache stringa di connessione, ad esempio:<cacheName>.redis.cache.windows.net:6380,password... |
Sì | |
Channel |
Canale secondario pub a cui il trigger deve restare in ascolto. Supporta modelli di canale in stile glob. Questo campo può essere risolto usando INameResolver . |
Sì |
Annotazioni
Parametro | Descrizione | Richiesto | Valore predefinito |
---|---|---|---|
name |
Nome della variabile che contiene il valore restituito dalla funzione. | Sì | |
connection |
Nome dell'impostazione dell'applicazione che contiene la cache stringa di connessione, ad esempio:<cacheName>.redis.cache.windows.net:6380,password... |
Sì | |
channel |
Canale secondario pub a cui il trigger deve restare in ascolto. Supporta modelli di canale in stile glob. | Sì |
Impostazione
Proprietà di function.json | Descrizione | Richiesto | Valore predefinito |
---|---|---|---|
type |
Tipo di trigger. Per il trigger secondario pub, il tipo è redisPubSubTrigger . |
Sì | |
connection |
Nome dell'impostazione dell'applicazione che contiene la cache stringa di connessione, ad esempio:<cacheName>.redis.cache.windows.net:6380,password... |
Sì | |
channel |
Nome del canale secondario pub a cui è in corso la sottoscrizione. | Sì | |
pattern |
Valore booleano per indicare che il canale specificato usa criteri di ricerca. Se pattern è true, il canale viene considerato come un modello di tipo glob anziché come valore letterale. |
Sì | |
name |
Nome della variabile che contiene il valore restituito dalla funzione. | Sì | |
direction |
Deve essere impostato su in . |
Sì |
Importante
Il connection
parametro non contiene la cache Redis stringa di connessione stessa. Punta invece al nome della variabile di ambiente che contiene il stringa di connessione. In questo modo l'applicazione è più sicura. Per altre informazioni, vedere Stringa di connessione Redis.
Utilizzo
Redis offre funzionalità di pubblicazione/sottoscrizione che consente l'invio di messaggi a Redis e la trasmissione ai sottoscrittori. RedisPubSubTrigger
consente di attivare Funzioni di Azure nell'attività pub/sub. L'RedisPubSubTrigger
sottoscrive un modello di canale specifico usando PSUBSCRIBE
e rende visibili i messaggi ricevuti su tali canali alla funzione.
Prerequisiti e limitazioni
RedisPubSubTrigger
non è in grado di ascoltare le notifiche keyspace nelle cache del cluster.- Le funzioni di livello Basic non supportano l'attivazione in
keyspace
o le notifichekeyevent
tramite ilRedisPubSubTrigger
. - Non
RedisPubSubTrigger
è supportato in un piano a consumo perché Redis PubSub richiede che i client siano sempre in ascolto attivo per ricevere tutti i messaggi. Per i piani a consumo, la funzione potrebbe perdere determinati messaggi pubblicati nel canale. - Le funzioni con
RedisPubSubTrigger
non devono essere ridimensionate in più istanze. Ogni istanza è in ascolto ed elabora ogni sottomessama di pubblicazione, con conseguente elaborazione duplicata.
Avviso
Questo trigger non è supportato in un piano a consumo perché Redis PubSub richiede che i client siano sempre in ascolto attivo per ricevere tutti i messaggi. Per i piani a consumo, la funzione potrebbe perdere determinati messaggi pubblicati nel canale.
Attivazione delle notifiche keyspace
Redis offre un concetto predefinito denominato notifiche keyspace. Se abilitata, questa funzionalità pubblica le notifiche di un'ampia gamma di azioni della cache in un canale pub/sub dedicato. Le azioni supportate includono azioni che influiscono su chiavi specifiche, denominate notifiche keyspace, e comandi specifici, denominatenotifiche keyevent. È supportata un'ampia gamma di azioni Redis, ad esempio, SET
, DEL
e EXPIRE
. L'elenco completo è disponibile nella documentazione relativa alla notifica keyspace.
Le notifiche keyspace
e keyevent
vengono pubblicate con la sintassi seguente:
PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>
Poiché questi eventi vengono pubblicati in canali pub/sub, l'oggetto RedisPubSubTrigger
è in grado di rilevarli. Per altri esempi, vedere la sezione RedisPubSubTrigger.
Importante
In Cache di Azure per Redis, gli eventi keyspace
devono essere abilitati prima della pubblicazione delle notifiche. Per altre informazioni, vedere Impostazioni avanzate.
Tipo | Descrizione |
---|---|
string |
Il messaggio del canale serializzato come JSON (UTF-8 codificato per i tipi di byte) nel formato seguente. |
Custom |
Il trigger usa Json.NET serializzazione per eseguire il mapping del messaggio dal canale al tipo personalizzato specificato. |
Formato stringa JSON
{
"SubscriptionChannel":"__keyspace@0__:*",
"Channel":"__keyspace@0__:mykey",
"Message":"set"
}
Tipo | Descrizione |
---|---|
string |
Il messaggio del canale serializzato come JSON (UTF-8 codificato per i tipi di byte) nel formato seguente. |
Custom |
Il trigger usa Json.NET serializzazione per eseguire il mapping del messaggio dal canale da a string in un tipo personalizzato. |
{
"SubscriptionChannel":"__keyspace@0__:*",
"Channel":"__keyspace@0__:mykey",
"Message":"set"
}