RedisPubSubTrigger för Azure Functions
Redis-funktioner publicerar/prenumererar funktioner som gör att meddelanden kan skickas till Redis och sändas till prenumeranter.
Mer information om Utlösare och bindningar i Azure Cache for Redis finns i Redis-tillägget för Azure Functions.
Omfång för tillgänglighet för funktionsutlösare
Utlösartyp | Azure Managed Redis | Azure Cache for Redis |
---|---|---|
Pub/underutlösare | Ja | Ja |
Viktigt!
När du använder Azure Managed Redis eller Enterprise-nivåerna i Azure Cache for Redis använder du port 10000 i stället för port 6380 eller 6379.
Varning
Den här utlösaren stöds inte i en förbrukningsplan eftersom Redis PubSub kräver att klienter alltid aktivt lyssnar för att ta emot alla meddelanden. För förbrukningsplaner kan funktionen missa vissa meddelanden som publicerats till kanalen.
Exempel
Körningsmodell | beskrivning |
---|---|
Isolerad arbetsmodell | Funktionskoden körs i en separat .NET-arbetsprocess. Använd med versioner av .NET och .NET Framework som stöds. Mer information finns i Utveckla .NET-isolerade arbetsprocessfunktioner. |
Processmodell | Funktionskoden körs i samma process som Functions-värdprocessen. Stöder endast LTS-versioner (Long Term Support) av .NET. Mer information finns i Utveckla .NET-klassbiblioteksfunktioner. |
Viktigt!
För .NET-funktioner rekommenderas användning av den isolerade arbetsmodellen över den pågående modellen. En jämförelse av de processbaserade och isolerade arbetsmodellerna finns i skillnader mellan den isolerade arbetsmodellen och den processbaserade modellen för .NET på Azure Functions.
Det här exemplet lyssnar på kanalen 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);
}
}
}
Det här exemplet lyssnar på alla keyspace-meddelanden för nyckeln 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);
}
}
}
Det här exemplet lyssnar på meddelanden keyevent
för borttagningskommandot 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.");
}
}
}
Det här exemplet lyssnar på kanalen 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);
}
}
Det här exemplet lyssnar på alla keyspace-meddelanden för nyckeln 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);
}
}
Det här exemplet lyssnar på meddelanden keyevent
för borttagningskommandot 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);
}
}
Det här exemplet använder samma index.js
fil, med bindningsdata i function.json
filen som avgör vilken kanal utlösaren inträffar på.
Här är index.js
filen:
module.exports = async function (context, message) {
context.log(message);
}
Från function.json
:
Här är bindningsdata för att lyssna på kanalen pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Här är bindningsdata för att lyssna på keyspace-meddelanden för nyckeln keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Här är bindningsdata för att keyevent
lyssna på meddelanden för borttagningskommandot DEL
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Det här exemplet använder samma run.ps1
fil, med bindningsdata i function.json
filen som avgör vilken kanal utlösaren inträffar på.
Här är run.ps1
filen:
param($message, $TriggerMetadata)
Write-Host $message
Från function.json
:
Här är bindningsdata för att lyssna på kanalen pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Här är bindningsdata för att lyssna på keyspace-meddelanden för nyckeln keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Här är bindningsdata för att keyevent
lyssna på meddelanden för borttagningskommandot DEL
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Programmeringsmodellen Python v1 kräver att du definierar bindningar i en separat function.json fil i funktionsmappen. Mer information finns i utvecklarguiden för Python.
Det här exemplet använder samma __init__.py
fil, med bindningsdata i function.json
filen som avgör vilken kanal utlösaren inträffar på.
Här är __init__.py
filen:
import logging
def main(message: str):
logging.info(message)
Från function.json
:
Här är bindningsdata för att lyssna på kanalen pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Här är bindningsdata för att lyssna på keyspace-meddelanden för nyckeln keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Här är bindningsdata för att keyevent
lyssna på meddelanden för borttagningskommandot DEL
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Attribut
Kommentarer
Konfiguration
Viktigt!
Parametern connection
innehåller inte Själva Redis-cachen anslutningssträng. I stället pekar den på namnet på miljövariabeln som innehåller anslutningssträng. Detta gör programmet säkrare. Mer information finns i Redis anslutningssträng.
Förbrukning
Redis-funktioner publicerar/prenumererar funktioner som gör att meddelanden kan skickas till Redis och sändas till prenumeranter. Gör RedisPubSubTrigger
att Azure Functions kan utlösas vid pub-/underaktivitet. Prenumererar RedisPubSubTrigger
på ett specifikt kanalmönster med hjälp av PSUBSCRIBE
och ytbehandlar meddelanden som tas emot på dessa kanaler till funktionen.
Förutsättningar och begränsningar
RedisPubSubTrigger
Kan inte lyssna på keyspace-meddelanden i klustrade cacheminnen.- Funktioner på grundläggande nivå stöder inte utlösande av
keyspace
ellerkeyevent
meddelanden viaRedisPubSubTrigger
. RedisPubSubTrigger
Stöds inte i en förbrukningsplan eftersom Redis PubSub kräver att klienter alltid aktivt lyssnar för att ta emot alla meddelanden. För förbrukningsplaner kan funktionen missa vissa meddelanden som publicerats till kanalen.- Funktioner med
RedisPubSubTrigger
ska inte skalas ut till flera instanser. Varje instans lyssnar och bearbetar varje pubundermeddelande, vilket resulterar i duplicerad bearbetning.
Varning
Den här utlösaren stöds inte i en förbrukningsplan eftersom Redis PubSub kräver att klienter alltid aktivt lyssnar för att ta emot alla meddelanden. För förbrukningsplaner kan funktionen missa vissa meddelanden som publicerats till kanalen.
Utlöses på keyspace-meddelanden
Redis erbjuder ett inbyggt koncept som kallas keyspace-meddelanden. När den här funktionen är aktiverad publicerar den meddelanden om en mängd olika cacheåtgärder till en dedikerad pub/underkanal. Åtgärder som stöds omfattar åtgärder som påverkar specifika nycklar, så kallade keyspace-meddelanden och specifika kommandon som kallas keyevent-meddelanden. Ett stort antal Redis-åtgärder stöds, till exempel SET
, DEL
och EXPIRE
. Den fullständiga listan finns i dokumentationen för keyspace-meddelanden.
Meddelandena keyspace
och keyevent
publiceras med följande syntax:
PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>
Eftersom dessa händelser publiceras på pub-/underkanaler kan de RedisPubSubTrigger
hämtas. Se avsnittet RedisPubSubTrigger för fler exempel.
Viktigt!
I Azure Cache for Redis keyspace
måste händelser aktiveras innan meddelanden publiceras. Mer information finns i Avancerade inställningar.
Typ | Beskrivning |
---|---|
string |
Kanalmeddelandet serialiserat som JSON (UTF-8 kodat för bytetyper) i följande format. |
Custom |
Utlösaren använder Json.NET serialisering för att mappa meddelandet från kanalen till den angivna anpassade typen. |
JSON-strängformat
{
"SubscriptionChannel":"__keyspace@0__:*",
"Channel":"__keyspace@0__:mykey",
"Message":"set"
}
Typ | Beskrivning |
---|---|
string |
Kanalmeddelandet serialiserat som JSON (UTF-8 kodat för bytetyper) i följande format. |
Custom |
Utlösaren använder Json.NET serialisering för att mappa meddelandet från kanalen från en string till en anpassad typ. |
{
"SubscriptionChannel":"__keyspace@0__:*",
"Channel":"__keyspace@0__:mykey",
"Message":"set"
}