分享方式:


適用於 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 觸發 keyspacekeyevent 通知。
  • 取用方案不支援 RedisPubSubTrigger因為 Redis PubSub 要求用戶端一律主動接聽以接收所有訊息。 對於取用方案,您的函式可能會遺漏發佈至通道的特定訊息。
  • 具有的 RedisPubSubTrigger 函式不應該相應放大為多個實例。 每個實例都會接聽並處理每個pub子訊息,導致重複處理。

警告

取用方案不支援此觸發程序,因為 Redis PubSub 要求用戶端一律主動接聽以接收所有的訊息。 對於取用方案,您的函式可能會遺漏發佈至通道的特定訊息。

在 keyspace 通知上觸發

Redis 提供稱為 keyspace 通知的內建概念。 啟用後,此功能會將各種快取動作的通知發佈至專用的 pub/sub 通道。 支援的動作包括會影響特定索引鍵 (稱為 keyspace 通知) 以及特定命令 (稱為 keyevent 通知) 的動作。 支援大量的 Redis 動作,例如 SETDELEXPIRE。 您可以在 keyspace 通知文件中找到完整清單。

keyspacekeyevent 通知會以下列語法發佈:

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"
}