Azure Functions용 RedisPubSubTrigger
Redis에는 메시지를 Redis로 보내고 구독자에게 브로드캐스팅할 수 있는 게시/구독 기능이 있습니다.
Azure Cache for Redis 트리거 및 바인딩에 대한 자세한 내용은 Azure Functions 용 Redis Extension입니다.
함수 트리거의 가용성 범위
트리거 형식 | Azure Managed Redis | Azure Cache for Redis |
---|---|---|
Pub/Sub 트리거 | 예 | 예 |
Important
Azure Managed Redis 또는 Azure Cache for Redis의 엔터프라이즈 계층을 사용하는 경우 포트 6380 또는 6379 대신 포트 10000을 사용합니다.
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",
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);
}
}
이 샘플은 트리거가 발생하는 채널을 결정하는 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",
"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"
}
이 샘플은 트리거가 발생하는 채널을 결정하는 function.json
파일의 바인딩 데이터와 함께 동일한 run.ps1
파일을 사용합니다.
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 개발자 가이드를 참조하세요.
이 샘플은 트리거가 발생하는 채널을 결정하는 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",
"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"
}
특성
매개 변수 | 설명 | 필수 항목 | 기본값 |
---|---|---|---|
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 하위 채널의 이름입니다. | 예 | |
pattern |
지정된 채널이 패턴 일치를 사용함을 나타내는 부울입니다. true이면 pattern 채널이 리터럴이 아닌 glob 스타일 패턴처럼 처리됩니다. |
예 | |
name |
함수에서 반환된 값을 보유하는 변수의 이름입니다. | 예 | |
direction |
in 로 설정해야 합니다. |
예 |
Important
connection
매개 변수는 Redis Cache 연결 문자열 자체를 보유하지 않습니다. 대신 연결 문자열을 보유하는 환경 변수의 이름을 가리킵니다. 이렇게 하면 애플리케이션이 더욱 안전해집니다. 자세한 내용은 Redis 연결 문자열을 참조하세요.
사용
Redis에는 메시지를 Redis로 보내고 구독자에게 브로드캐스팅할 수 있는 게시/구독 기능이 있습니다. RedisPubSubTrigger
를 사용하면 게시/구독 작업에서 Azure Functions를 트리거할 수 있습니다. RedisPubSubTrigger
는 PSUBSCRIBE
를 사용하여 특정 채널 패턴을 구독하고 해당 채널에서 수신된 메시지를 함수에 표시합니다.
필수 구성 요소 및 제한 사항
RedisPubSubTrigger
는 클러스터형 캐시에서 키스페이스 알림을 수신할 수 없습니다.- 기본 계층 함수는
RedisPubSubTrigger
를 통한keyspace
또는keyevent
알림 트리거를 지원하지 않습니다. - Redis PubSub에서는 클라이언트가 모든 메시지를 수신하기 위해 항상 적극적으로 수신 대기해야 하기 때문에
RedisPubSubTrigger
는 사용량 플랜에서 지원되지 않습니다. 사용량 플랜의 경우 함수가 채널에 게시된 특정 메시지를 놓칠 수 있습니다. RedisPubSubTrigger
가 포함된 함수는 여러 인스턴스로 크기 조정되어서는 안 됩니다. 각 인스턴스는 각 pub 하위 메시지를 수신 대기하고 처리하므로 중복 처리가 발생합니다.
Warning
Redis PubSub에서는 클라이언트가 모든 메시지를 수신하기 위해 항상 적극적으로 수신 대기해야 하므로 이 트리거는 사용량 플랜에서 지원되지 않습니다. 사용량 플랜의 경우 함수가 채널에 게시된 특정 메시지를 놓칠 수 있습니다.
키스페이스 알림 트리거
Redis는 키스페이스 알림이라는 기본 제품 개념을 제공합니다. 사용하도록 설정되면 이 기능은 광범위한 캐시 작업에 대한 알림을 전용 게시/구독 채널에 게시합니다. 지원되는 작업에는 키스페이스 알림이라는 특정 키에 영향을 미치는 작업과 키이벤트 알림이라는 특정 명령이 포함됩니다. SET
, DEL
, EXPIRE
등 광범위한 Redis 작업이 지원됩니다. 전체 목록은 키스페이스 알림 설명서에서 찾을 수 있습니다.
keyspace
및 keyevent
알림은 다음 구문으로 게시됩니다.
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"
}