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 的长期支持 (LTS) 版本。 若要了解详细信息,请参阅开发 .NET 类库函数
独立工作进程 函数代码在单独的 .NET 工作进程中运行。 与受支持的 .NET 和 .NET Framework 版本结合使用。 若要了解详细信息,请参阅开发 .NET 独立工作进程函数

重要

对于 .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"
}