Share via


Azure Functions 用 RedisPubSubTrigger (プレビュー)

Redis には、メッセージを Redis に送信し、サブスクライバーにブロードキャストできるようにする パブリッシュ/サブスクライブ機能が備わっています。

Azure Cache for Redis のトリガーとバインドの詳細については、 Azure Functions 用の Redis 拡張機能を参照してください。

関数トリガーの可用性のスコープ

レベル Basic Standard、Premium Enterprise、Enterprise Flash
パブリッシュ/サブスクライブ トリガー はい イエス はい

警告

Redis PubSub ではクライアントはすべてのメッセージを受信するために常にアクティブにリッスンしている必要があるため、このトリガーは従量課金プランではサポートされていません。 従量課金プランの場合、チャネルに発行された特定のメッセージを関数が受け取り損ねる可能性があります。

重要

Functions の Node.js v4 モデルは、Azure Cache for Redis 拡張機能ではまだサポートされていません。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

重要

Functions 用 Python v2 モデルは、Azure Cache for Redis 拡張機能ではまだサポートされていません。 v2 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。

実行モデル 説明
分離ワーカー モデル 関数コードは、別の .NET ワーカー プロセスで実行されます。 .NET と .NET Framework のサポートされているバージョンで使います。 詳細については、.NET 分離ワーカー プロセス関数の開発に関する記事を参照してください。
インプロセス モデル 関数コードは、Functions ホスト プロセスと同じプロセスで実行されます。 .NET の長期サポート (LTS) バージョンのみをサポートします。 詳細については、.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")
                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")
                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")
                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",
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "index.js"
}

キー keyspaceTest のキースペース通知をリッスンするためのバインディング データは次のとおりです。

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

削除コマンド DELkeyevent 通知をリッスンするためのバインディング データは次のとおりです。

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyevent@0__:del",
      "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",
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "run.ps1"
}

キー keyspaceTest のキースペース通知をリッスンするためのバインディング データは次のとおりです。

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

削除コマンド DELkeyevent 通知をリッスンするためのバインディング データは次のとおりです。

{
  "bindings": [
    {
      "type": "redisPubSubTrigger",
      "connection": "redisConnectionString",
      "channel": "__keyevent@0__:del",
      "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",
      "name": "message",
      "direction": "in"
    }
  ],
  "scriptFile": "__init__.py"
}

キー keyspaceTest のキースペース通知をリッスンするためのバインディング データは次のとおりです。

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

削除コマンド DELkeyevent 通知をリッスンするためのバインディング データは次のとおりです。

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

属性

パラメーター Description 必要 Default
Connection キャッシュ 接続文字列を含むアプリケーション設定名前。次に例を示します。<cacheName>.redis.cache.windows.net:6380,password... はい
Channel トリガーがリッスンする必要のあるパブリッシュ/サブスクライブ チャネル。 glob スタイルのチャネル パターンをサポートします。 このフィールドは、INameResolver を使用して解決できます。 はい

注釈

パラメーター Description 必要 Default
name 関数によって返される値を保持する変数の名前。 はい
connection キャッシュ 接続文字列を含むアプリケーション設定名前。次に例を示します。<cacheName>.redis.cache.windows.net:6380,password... はい
channel トリガーがリッスンする必要のあるパブリッシュ/サブスクライブ チャネル。 glob スタイルのチャネル パターンをサポートします。 はい

構成

function.json のプロパティ 説明 必要 Default
type トリガーの種類。 pub サブ トリガーの場合、型は redisPubSubTrigger. はい
connection キャッシュ 接続文字列を含むアプリケーション設定名前。次に例を示します。<cacheName>.redis.cache.windows.net:6380,password... はい
channel サブスクライブしているパブリッシュ/サブスクライブ チャネルの名前 はい
name 関数によって返される値を保持する変数の名前。 はい
direction in に設定する必要があります。 はい

重要

connection パラメーターには、Redis キャッシュ接続文字列自体は保持されません。 代わりに、接続文字列を保持する環境変数の名前を指します。 この場合、アプリケーションがより安全になります。 詳細については、「Redis 接続文字列」を参照してください。

使用方法

Redis には、メッセージを Redis に送信し、サブスクライバーにブロードキャストできるようにする パブリッシュ/サブスクライブ機能が備わっています。 RedisPubSubTrigger を使用すると、パブリッシュ/サブスクライブ アクティビティで Azure Functions をトリガーできます。 RedisPubSubTrigger は、PSUBSCRIBE を使用して特定のチャネル パターンをサブスクライブし、それらのチャネルで受信したメッセージを関数に提示します。

前提条件と制限事項

  • RedisPubSubTrigger には、クラスター化されたキャッシュでキースペース通知をリッスンする機能はありません。
  • Basic レベルの関数では、RedisPubSubTrigger による keyspace または keyevent 通知のトリガーはサポートされていません。
  • Redis PubSub ではクライアントはすべてのメッセージを受信するために常にアクティブにリッスンしている必要があるため、RedisPubSubTrigger従量課金プランではサポートされていません。 従量課金プランの場合、チャネルに発行された特定のメッセージを関数が受け取り損ねる可能性があります。
  • RedisPubSubTrigger を使う関数は、複数のインスタンスにスケールアウトしないでください。 各インスタンスは、各 pub サブ メッセージをリッスンして処理し、重複する処理を行います。

警告

Redis PubSub ではクライアントはすべてのメッセージを受信するために常にアクティブにリッスンしている必要があるため、このトリガーは従量課金プランではサポートされていません。 従量課金プランの場合、チャネルに発行された特定のメッセージを関数が受け取り損ねる可能性があります。

キースペース通知でのトリガー

Redis には、キースペース通知と呼ばれる組み込みの概念が用意されています。 この機能を有効にすると、さまざまなキャッシュ アクションの通知が、専用の pub/sub チャネルに発行されます。 サポートされているアクションとしては、"キースペース通知" と呼ばれる特定のキーに影響を与えるものと、"キーイベント通知" と呼ばれる特定のコマンドに影響を与えるものがあります。 SETDELEXPIRE など、さまざまな Redis アクションがサポートされています。 完全な一覧については、キースペース通知に関するドキュメントをご覧ください。

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