Azure Functions 用 RedisPubSubTrigger
Redis には、メッセージを Redis に送信し、サブスクライバーにブロードキャストできるようにする パブリッシュ/サブスクライブ機能が備わっています。
Azure Cache for Redis のトリガーとバインドの詳細については、Azure Functions 用の Redis 拡張機能。
関数トリガーの可用性のスコープ
トリガーの種類 | Azure Managed Redis | Azure Cache for Redis |
---|---|---|
パブリッシュ/サブスクライブ トリガー | はい | 可 |
重要
Azure Managed Redis または Azure Cache for Redis の Enterprise レベルを使用する場合は、ポート 6380 または 6379 ではなくポート 10000 を使用します。
警告
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 関数の場合は、"インプロセス" モデルより、"分離ワーカー モデル" を使うことをお勧めします。 in-process と isolated worker モデルの比較については、azure Functions の .NET の isolated worker モデルと in-process モデルの違いを参照してください。
このサンプルでは、チャネル 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"
}
属性
パラメーター | 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 |
サブスクライブしている pub サブ チャネルの名前。 | はい | |
pattern |
指定されたチャネルがパターン マッチングを使用することを示すブール値。 pattern が true の場合、チャネルはリテラルではなく、glob スタイル パターンとして扱われます。 |
はい | |
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 チャネルに発行されます。 サポートされているアクションとしては、"キースペース通知" と呼ばれる特定のキーに影響を与えるものと、"キーイベント通知" と呼ばれる特定のコマンドに影響を与えるものがあります。 SET
、DEL
、EXPIRE
など、さまざまな Redis アクションがサポートされています。 完全な一覧については、キースペース通知に関するドキュメントをご覧ください。
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"
}