適用於 Azure Functions 的 RedisPubSubTrigger
Redis 具有 發佈/訂閱功能 ,可讓訊息傳送至 Redis,並廣播給訂閱者。
如需 Azure Cache for Redis 觸發程式和系結的詳細資訊, 請參閱適用於 Azure Functions 的 Redis 擴充功能。
函式觸發程序的可用性範圍
層 | 基本 | 標準,進階 | Enterprise,Enterprise Flash |
---|---|---|---|
Pub/Sub 觸發程式 | Yes | .是 | Yes |
警告
取用方案不支援此觸發程序,因為 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 開發人員指南。
範例
執行模型 | 描述 |
---|---|
隔離式背景工作模型 | 您的函數程式碼在個別的 .NET 背景工作處理序中執行。 搭配支援的 .NET 和 .NET Framework 版本使用。 若要深入了解,請參閱開發 .NET 隔離式背景工作處理序函數。 |
同處理序模型 | 您的函數程式碼執行的處理序與 Functions 主機處理序相同。 僅支援長期支援 (LTS) 的 .NET 版本。 若要深入了解,請參閱開發 .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
的任何keyspace 通知。
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);
}
}
}
此範例會接聽 delete 命令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
的任何keyspace 通知。
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);
}
}
此範例會接聽 delete 命令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
之keyspace通知的系結數據。
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
以下是接聽 keyevent
delete 命令 DEL
通知的系結數據。
{
"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
之keyspace通知的系結數據。
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
以下是接聽 keyevent
delete 命令 DEL
通知的系結數據。
{
"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
之keyspace通知的系結數據。
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
以下是接聽 keyevent
delete 命令 DEL
通知的系結數據。
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
屬性
參數 | 描述: | 是必要欄位 | 預設 |
---|---|---|---|
Connection |
包含快取 連接字串 的應用程式設定名稱,例如:<cacheName>.redis.cache.windows.net:6380,password... |
Yes | |
Channel |
觸發程式應該接聽的 pub 子通道。 支援 glob 樣式的通道模式。 您可使用 INameResolver 來解析此欄位。 |
Yes |
註釋
參數 | 描述: | 是必要欄位 | 預設 |
---|---|---|---|
name |
包含函式所傳回值的變數名稱。 | Yes | |
connection |
包含快取 連接字串 的應用程式設定名稱,例如:<cacheName>.redis.cache.windows.net:6380,password... |
Yes | |
channel |
觸發程式應該接聽的 pub 子通道。 支援 glob 樣式的通道模式。 | Yes |
組態
function.json 屬性 | 描述 | 是必要欄位 | 預設 |
---|---|---|---|
type |
觸發程式類型。 對於 pub 子觸發程式,類型為 redisPubSubTrigger 。 |
Yes | |
connection |
包含快取 連接字串 的應用程式設定名稱,例如:<cacheName>.redis.cache.windows.net:6380,password... |
Yes | |
channel |
要訂閱的pub子頻道名稱。 | Yes | |
pattern |
布爾值,表示指定的通道使用模式數學運算。 如果 pattern 為 true,則會將通道視為 glob 樣式 模式,而不是常值。 |
Yes | |
name |
包含函式所傳回值的變數名稱。 | Yes | |
direction |
必須設定為 in 。 |
Yes |
重要
參數connection
不會保留 Redis 快取 連接字串 本身。 相反地,它會指向保留 連接字串的環境變數名稱。 這可讓應用程式更安全。 如需詳細資訊,請參閱 Redis 連接字串。
使用方式
Redis 具有 發佈/訂閱功能 ,可讓訊息傳送至 Redis,並廣播給訂閱者。 RedisPubSubTrigger
可讓 Azure Functions 在 pub/sub 活動上觸發。 RedisPubSubTrigger
會使用 PSUBSCRIBE
來訂閱特定通道模式,並將在這些通道上收到的訊息呈現至函式。
先決條件與限制
RedisPubSubTrigger
無法接聽叢集快取上的 keyspace 通知。- 基本層函式不支援透過
RedisPubSubTrigger
觸發keyspace
或keyevent
通知。 - 取用方案不支援 ,
RedisPubSubTrigger
因為 Redis PubSub 要求用戶端一律主動接聽以接收所有訊息。 對於取用方案,您的函式可能會遺漏發佈至通道的特定訊息。 - 具有的
RedisPubSubTrigger
函式不應該相應放大為多個實例。 每個實例都會接聽並處理每個pub子訊息,導致重複處理。
警告
取用方案不支援此觸發程序,因為 Redis PubSub 要求用戶端一律主動接聽以接收所有的訊息。 對於取用方案,您的函式可能會遺漏發佈至通道的特定訊息。
在 keyspace 通知上觸發
Redis 提供稱為 keyspace 通知的內建概念。 啟用後,此功能會將各種快取動作的通知發佈至專用的 pub/sub 通道。 支援的動作包括會影響特定索引鍵 (稱為 keyspace 通知) 以及特定命令 (稱為 keyevent 通知) 的動作。 支援大量的 Redis 動作,例如 SET
、DEL
和 EXPIRE
。 您可以在 keyspace 通知文件中找到完整清單。
keyspace
和 keyevent
通知會以下列語法發佈:
PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>
因為這些事件會在 pub/sub 通道上發佈,因此 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"
}