Azure Functions 的 RedisPubSubTrigger

Redis 具有发布/订阅功能,使消息能够发送到 Redis 并广播给订阅者。

有关 Azure Cache for Redis 触发器和绑定的详细信息,请参阅用于 Azure Functions 的 Redis 扩展

函数触发器的可用性范围

Basic 标准、高级 Enterprise、Enterprise Flash
发布/订阅触发器

警告

消耗计划不支持此触发器,因为 Redis PubSub 要求客户端始终主动侦听以接收所有消息。 对于消耗计划,函数可能会错过发布到通道的某些消息。

重要

Azure Cache for Redis 缓存扩展尚不支持适用于 Functions 的 Node.js v4 模型。 有关 v4 模型工作原理的更多详细信息,请参阅 Azure Functions Node.js 开发人员指南。 要详细了解 v3 和 v4 之间的差异,请参阅迁移指南

重要

Azure Cache for Redis 缓存扩展尚不支持适用于 Functions 的 Python v2 模型。 有关 v2 模型工作原理的更多详细信息,请参阅 Azure Functions Python 开发人员指南

示例

执行模型 说明
进程内 函数代码与 Functions 宿主进程在同一进程中运行。 请在开始之前,查看 .NET 支持的版本。 若要了解详细信息,请参阅使用 Azure Functions 开发 C# 类库函数
隔离进程 函数代码在单独的 .NET 工作进程中运行。 请在开始之前,查看 .NET 支持的版本。 有关详细信息,请参阅在 C# 中开发隔离进程函数

重要

对于 .NET 函数,建议在进程内模型中使用独立辅助角色模型。 有关进程内和隔离辅助角色模型的比较,请参阅 Azure Functions 上 .NET 的独立辅助角色模型与进程内模型之间的差异。

此示例侦听 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);
        }
    }
}

此示例侦听 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);
        }
    }
}

此示例侦听删除命令 DEL 的任何 keyevent 通知。

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

此示例侦听 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);
    }
}


此示例侦听 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);
    }
}

此示例侦听删除命令 DEL 的任何 keyevent 通知。

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

此示例使用相同的 index.js 文件,其中 function.json 文件中的绑定数据可确定触发器发生的通道。

index.js 文件如下所示:

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

function.json

下面是用于侦听 pubsubTest 通道的绑定数据。

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

下面是用于侦听 keyspaceTest 密钥的密钥空间通知的绑定数据。

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

下面是用于侦听删除命令 DELkeyevent 通知的绑定数据。

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

此示例使用相同的 run.ps1 文件,其中 function.json 文件中的绑定数据可确定触发器发生的通道。

run.ps1 文件如下所示:

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

function.json

下面是用于侦听 pubsubTest 通道的绑定数据。

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

下面是用于侦听 keyspaceTest 密钥的密钥空间通知的绑定数据。

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

下面是用于侦听删除命令 DELkeyevent 通知的绑定数据。

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

Python v1 编程模型要求在函数文件夹中的单独 function.json 文件中定义绑定。 有关详细信息,请参阅 Python 开发人员指南

此示例使用相同的 __init__.py 文件,其中 function.json 文件中的绑定数据可确定触发器发生的通道。

__init__.py 文件如下所示:

import logging

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

function.json

下面是用于侦听 pubsubTest 通道的绑定数据。

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

下面是用于侦听 keyspaceTest 密钥的密钥空间通知的绑定数据。

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

下面是用于侦听删除命令 DELkeyevent 通知的绑定数据。

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

特性

参数 步骤 需要 默认
Connection 包含缓存连接字符串的应用程序设置的名称,例如:<cacheName>.redis.cache.chinacloudapi.cn:6380,password...
Channel 触发器应侦听的 pub sub 通道。 支持 glob 样式的通道模式。 可以使用 INameResolver 解析此字段。

批注

参数 步骤 需要 默认
name 包含函数返回的值的变量的名称。
connection 包含缓存连接字符串的应用程序设置的名称,例如:<cacheName>.redis.cache.chinacloudapi.cn:6380,password...
channel 触发器应侦听的 pub sub 通道。 支持 glob 样式的通道模式。

配置

“function.json”属性 说明 需要 默认
type 触发器类型。 对于 pub 子触发器,类型为 redisPubSubTrigger
connection 包含缓存连接字符串的应用程序设置的名称,例如:<cacheName>.redis.cache.chinacloudapi.cn:6380,password...
channel 正在订阅的 pub sub 通道的名称。
pattern 指示给定通道使用模式匹配的布尔值。 如果 pattern 为 true,则通道被视为 glob-style 模式,而不是文本。
name 包含函数返回的值的变量的名称。
direction 必须设置为 in

重要

connection 参数不包含 Redis 缓存连接字符串本身。 相反,它指向包含连接字符串的环境变量的名称。 这会使应用程序更安全。 有关详细信息,请参阅 Redis 连接字符串

使用情况

Redis 具有发布/订阅功能,使消息能够发送到 Redis 并广播给订阅者。 使用 RedisPubSubTrigger,可以在 pub/sub 活动上触发 Azure Functions。 RedisPubSubTrigger 使用 PSUBSCRIBE 订阅特定的通道模式,并将在这些通道上接收的消息呈现给函数。

先决条件和限制

  • RedisPubSubTrigger 无法侦听群集缓存上的密钥空间通知
  • 基本层函数不支持通过 RedisPubSubTrigger 触发 keyspacekeyevent 通知。
  • 消耗计划不支持 RedisPubSubTrigger,因为 Redis PubSub 要求客户端始终主动侦听以接收所有消息。 对于消耗计划,函数可能会错过发布到通道的某些消息。
  • 具有 RedisPubSubTrigger 的函数不应横向扩展到多个实例。 每个实例侦听并处理每条发布子消息,从而导致重复处理。

警告

消耗计划不支持此触发器,因为 Redis PubSub 要求客户端始终主动侦听以接收所有消息。 对于消耗计划,函数可能会错过发布到通道的某些消息。

在密钥空间通知上触发

Redis 提供了一个称为密钥空间通知的内置概念。 启用此功能后,会将各种缓存操作的通知发布到专用发布/订阅频道。 支持的操作包括影响特定密钥的操作(称为密钥空间通知)和特定命令(称为密钥事件通知)。 支持大量 Redis 操作,例如 SETDELEXPIRE。 有关完整列表,请参阅密钥空间通知文档

keyspacekeyevent 通知使用以下语法发布:

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

由于这些事件发布在发布/订阅频道上,因此 RedisPubSubTrigger 能够接收它们。 有关更多示例,请参阅 RedisPubSubTrigger 部分。

重要

在 Azure Cache for Redis 中,必须先启用 keyspace 事件,然后才能发布通知。 有关详细信息,请参阅高级设置

类型 描述
string 以以下格式序列化为 JSON 的通道消息(为字节类型编码的 UTF-8)。
Custom 触发器将使用 Json.NET 序列化将通道中的消息映射到给定的自定义类型。

JSON 字符串格式

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

类型 描述
string 以以下格式序列化为 JSON 的通道消息(为字节类型编码的 UTF-8)。
Custom 触发器使用 Json.NET 序列化将通道中的消息从 string 映射到自定义类型。
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}