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"
}
下面是用于侦听删除命令 DEL
的 keyevent
通知的绑定数据。
{
"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"
}
下面是用于侦听删除命令 DEL
的 keyevent
通知的绑定数据。
{
"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"
}
下面是用于侦听删除命令 DEL
的 keyevent
通知的绑定数据。
{
"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
触发keyspace
或keyevent
通知。 - 消耗计划不支持
RedisPubSubTrigger
,因为 Redis PubSub 要求客户端始终主动侦听以接收所有消息。 对于消耗计划,函数可能会错过发布到通道的某些消息。 - 具有
RedisPubSubTrigger
的函数不应横向扩展到多个实例。 每个实例侦听并处理每条发布子消息,从而导致重复处理。
警告
消耗计划不支持此触发器,因为 Redis PubSub 要求客户端始终主动侦听以接收所有消息。 对于消耗计划,函数可能会错过发布到通道的某些消息。
在密钥空间通知上触发
Redis 提供了一个称为密钥空间通知的内置概念。 启用此功能后,会将各种缓存操作的通知发布到专用发布/订阅频道。 支持的操作包括影响特定密钥的操作(称为密钥空间通知)和特定命令(称为密钥事件通知)。 支持大量 Redis 操作,例如 SET
、DEL
和 EXPIRE
。 有关完整列表,请参阅密钥空间通知文档。
keyspace
和 keyevent
通知使用以下语法发布:
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"
}