Share via


Azure Functions용 RedisPubSubTrigger(미리 보기)

Redis에는 메시지를 Redis로 보내고 구독자에게 브로드캐스팅할 수 있는 게시/구독 기능이 있습니다.

Azure Cache for Redis 트리거 및 바인딩에 대한 자세한 내용은 Azure Functions 용 Redis Extension입니다.

함수 트리거의 가용성 범위

계층 기본 표준, 프리미엄 Enterprise, Enterprise Flash
Pub/Sub 트리거

Warning

Redis PubSub에서는 클라이언트가 모든 메시지를 수신하기 위해 항상 적극적으로 수신 대기해야 하므로 이 트리거는 사용량 플랜에서 지원되지 않습니다. 사용량 플랜의 경우 함수가 채널에 게시된 특정 메시지를 놓칠 수 있습니다.

Important

Functions용 Node.js v4 모델은 Azure Cache for Redis 확장에서 아직 지원되지 않습니다. v4 모델의 작동 방식에 대한 자세한 내용은 Azure Functions Node.js 개발자 가이드를 참조하세요. v3과 v4의 차이점에 대해 자세히 알아보려면 마이그레이션 가이드를 참조하세요.

Important

Functions용 Python v2 모델은 Azure Cache for Redis 확장에서 아직 지원되지 않습니다. v2 모델의 작동 방식에 대한 자세한 내용은 Azure Functions Python 개발자 가이드를 참조하세요.

예제

실행 모델 설명
격리된 작업자 모델 함수 코드는 별도의 .NET 작업자 프로세스에서 실행됩니다. 지원되는 .NET 및 .NET Framework 버전과 함께 사용합니다. 자세한 내용은 .NET 격리 작업자 프로세스 함수 개발을 참조하세요.
In Process 모델 함수 코드는 Functions 호스트 프로세스와 동일한 프로세스에서 실행됩니다. .NET의 LTS(장기 지원) 버전만 지원합니다. 자세한 내용은 .NET 클래스 라이브러리 함수 개발을 참조하세요.

Important

.NET 함수의 경우 In Process 모델보다 격리된 작업자 모델을 사용하는 것이 좋습니다. In-Process 모델과 격리된 작업자 모델을 비교하려면 격리된 작업자 모델과 Azure Functions의 .NET에 대한 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")
                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);
    }
}

이 샘플은 트리거가 발생하는 채널을 결정하는 function.json 파일의 바인딩 데이터와 함께 동일한 index.js 파일을 사용합니다.

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

다음은 삭제 명령 DEL에 대한 keyevent 알림을 수신하기 위한 바인딩 데이터입니다.

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

이 샘플은 트리거가 발생하는 채널을 결정하는 function.json 파일의 바인딩 데이터와 함께 동일한 run.ps1 파일을 사용합니다.

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

다음은 삭제 명령 DEL에 대한 keyevent 알림을 수신하기 위한 바인딩 데이터입니다.

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

Python v1 프로그래밍 모델을 사용하려면 함수 폴더의 별도 function.json 파일에서 바인딩을 정의해야 합니다. 자세한 내용은 Python 개발자 가이드참조하세요.

이 샘플은 트리거가 발생하는 채널을 결정하는 function.json 파일의 바인딩 데이터와 함께 동일한 __init__.py 파일을 사용합니다.

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

다음은 삭제 명령 DEL에 대한 keyevent 알림을 수신하기 위한 바인딩 데이터입니다.

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

특성

매개 변수 설명 필수 항목 기본값
Connection 다음과 같이 캐시 연결 문자열 포함하는 애플리케이션 설정이름입니다.<cacheName>.redis.cache.windows.net:6380,password...
Channel 트리거가 수신 대기해야 하는 Pub Sub 채널입니다. 글로벌 스타일 채널 패턴을 지원합니다. 이 필드는 INameResolver를 사용하여 분석할 수 있습니다.

주석

매개 변수 설명 필수 항목 기본값
name 함수에서 반환된 값을 보유하는 변수의 이름입니다.
connection 다음과 같이 캐시 연결 문자열 포함하는 애플리케이션 설정이름입니다.<cacheName>.redis.cache.windows.net:6380,password...
channel 트리거가 수신 대기해야 하는 Pub Sub 채널입니다. 글로벌 스타일 채널 패턴을 지원합니다.

구성

function.json 속성 설명 필수 항목 기본값
type 트리거 유형입니다. pub 하위 트리거의 경우 형식은 .입니다 redisPubSubTrigger.
connection 다음과 같이 캐시 연결 문자열 포함하는 애플리케이션 설정이름입니다.<cacheName>.redis.cache.windows.net:6380,password...
channel 구독 중인 Pub Sub 채널의 이름
name 함수에서 반환된 값을 보유하는 변수의 이름입니다.
direction in로 설정해야 합니다.

Important

connection 매개 변수는 Redis Cache 연결 문자열 자체를 보유하지 않습니다. 대신 연결 문자열을 보유하는 환경 변수의 이름을 가리킵니다. 이렇게 하면 애플리케이션이 더욱 안전해집니다. 자세한 내용은 Redis 연결 문자열을 참조하세요.

사용

Redis에는 메시지를 Redis로 보내고 구독자에게 브로드캐스팅할 수 있는 게시/구독 기능이 있습니다. RedisPubSubTrigger를 사용하면 게시/구독 작업에서 Azure Functions를 트리거할 수 있습니다. RedisPubSubTriggerPSUBSCRIBE를 사용하여 특정 채널 패턴을 구독하고 해당 채널에서 수신된 메시지를 함수에 표시합니다.

필수 구성 요소 및 제한 사항

  • RedisPubSubTrigger는 클러스터형 캐시에서 키스페이스 알림을 수신할 수 없습니다.
  • 기본 계층 함수는 RedisPubSubTrigger를 통한 keyspace 또는 keyevent 알림 트리거를 지원하지 않습니다.
  • Redis PubSub에서는 클라이언트가 모든 메시지를 수신하기 위해 항상 적극적으로 수신 대기해야 하기 때문에 RedisPubSubTrigger사용량 플랜에서 지원되지 않습니다. 사용량 플랜의 경우 함수가 채널에 게시된 특정 메시지를 놓칠 수 있습니다.
  • RedisPubSubTrigger가 포함된 함수는 여러 인스턴스로 크기 조정되어서는 안 됩니다. 각 인스턴스는 각 pub 하위 메시지를 수신 대기하고 처리하므로 중복 처리가 발생합니다.

Warning

Redis PubSub에서는 클라이언트가 모든 메시지를 수신하기 위해 항상 적극적으로 수신 대기해야 하므로 이 트리거는 사용량 플랜에서 지원되지 않습니다. 사용량 플랜의 경우 함수가 채널에 게시된 특정 메시지를 놓칠 수 있습니다.

키스페이스 알림 트리거

Redis는 키스페이스 알림이라는 기본 제품 개념을 제공합니다. 사용하도록 설정되면 이 기능은 광범위한 캐시 작업에 대한 알림을 전용 게시/구독 채널에 게시합니다. 지원되는 작업에는 키스페이스 알림이라는 특정 키에 영향을 미치는 작업과 키이벤트 알림이라는 특정 명령이 포함됩니다. SET, DEL, EXPIRE 등 광범위한 Redis 작업이 지원됩니다. 전체 목록은 키스페이스 알림 설명서에서 찾을 수 있습니다.

keyspacekeyevent 알림은 다음 구문으로 게시됩니다.

PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>

이러한 이벤트는 게시/구독 채널에 게시되므로 RedisPubSubTrigger가 이를 선택할 수 있습니다. 더 많은 예를 보려면 RedisPubSubTrigger 섹션을 참조하세요.

Important

Azure Cache for Redis에서는 알림이 게시되기 전에 keyspace 이벤트를 사용하도록 설정해야 합니다. 자세한 내용은 고급 설정을 참조하세요.

Type 설명
string JSON으로 직렬화된 채널 메시지(바이트 형식에 대해 UTF-8로 인코딩됨)는 다음과 같은 형식으로 표시됩니다.
Custom 트리거는 Json.NET serialization을 사용하여 채널의 메시지를 지정된 사용자 지정 형식으로 매핑합니다.

JSON 문자열 형식

{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}

Type 설명
string JSON으로 직렬화된 채널 메시지(바이트 형식에 대해 UTF-8로 인코딩됨)는 다음과 같은 형식으로 표시됩니다.
Custom 트리거는 Json.NET 직렬화를 사용하여 채널의 메시지를 string에서 사용자 지정 형식으로 매핑합니다.
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}