RedisPubSubTrigger para Azure Functions
O Redis apresenta a funcionalidade de publicação/assinatura que permite que as mensagens sejam enviadas ao Redis e transmitidas aos assinantes.
Para obter mais informações sobre gatilhos e associações do Cache do Azure para Redis, consulte Extensão do Redis para Azure Functions.
Escopo de disponibilidade para gatilhos de funções
Tipo de gatilho | Redis Gerenciado do Azure | Cache Redis do Azure |
---|---|---|
Gatilho pub/sub | Sim | Sim |
Importante
Ao usar o Azure Managed Redis ou as camadas Enterprise do Cache do Azure para Redis, use a porta 10000 em vez da porta 6380 ou 6379.
Aviso
Esse gatilho não tem suporte em um plano de consumo porque o Redis PubSub exige que os clientes sempre estejam escutando ativamente para receber todas as mensagens. Para planos de consumo, sua função pode perder determinadas mensagens publicadas no canal.
Importante
O modelo Node.js v4 para Functions ainda não tem suporte na extensão Cache do Azure para Redis. Para obter mais detalhes sobre como funciona o modelo v4, consulte o Guia do desenvolvedor do Node.js para o Azure Functions. Para saber mais sobre as diferenças entre os modelos v3 e a v4, consulte o Guia de migração.
Importante
O modelo Python v2 para Functions ainda não é compatível com a extensão Cache do Azure para Redis. Para obter mais detalhes sobre como funciona o modelo v2, consulte o Guia de desenvolvedor do Node.js para Azure Functions.
Exemplos
Modelo de execução | Descrição |
---|---|
Modelo de trabalho isolado | O código de função é executado em um processo de trabalho do .NET separado. Use com versões com suporte do .NET e do .NET Framework. Para saber mais, confira Desenvolver funções de processo de trabalho isolado no .NET. |
Modelo em processo | Seu código de função é executado no mesmo processo que o processo de host do Functions. Dá suporte apenas a versões LTS (suporte de longo prazo) do .NET. Para saber mais, confira Desenvolver funções de biblioteca de classes do .NET. |
Importante
Para funções .NET, é recomendado usar o modelo de trabalho isolado em vez do modelo em processo. Para obter uma comparação dos modelos de trabalho em processo e isolados, consulte as diferenças entre o modelo de trabalho isolado e o modelo em processo para .NET no Azure Functions.
Este exemplo escuta o canal 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);
}
}
}
Esta amostra escuta todas as notificações de keyspace da chave 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);
}
}
}
Esta amostra escuta todas as notificações keyevent
do comando delete DEL
.
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.");
}
}
}
Este exemplo escuta o canal 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);
}
}
Esta amostra escuta todas as notificações de keyspace da chave 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);
}
}
Esta amostra escuta todas as notificações keyevent
do comando delete DEL
.
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);
}
}
Cada amostra usa o mesmo arquivo index.js
, com os dados vinculativos no arquivo function.json
determinando em qual canal o gatilho ocorre.
Aqui está o arquivo index.js
:
module.exports = async function (context, message) {
context.log(message);
}
De function.json
:
Aqui estão os dados de associação para ouvir o canal pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Aqui estão os dados de associação para ouvir as notificações do keyspace da chave keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Aqui estão os dados de associação para ouvir as notificações keyevent
do comando delete DEL
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "index.js"
}
Cada amostra usa o mesmo arquivo run.ps1
, com os dados vinculativos no arquivo function.json
determinando em qual canal o gatilho ocorre.
Aqui está o arquivo run.ps1
:
param($message, $TriggerMetadata)
Write-Host $message
De function.json
:
Aqui estão os dados de associação para ouvir o canal pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Aqui estão os dados de associação para ouvir as notificações do keyspace da chave keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
Aqui estão os dados de associação para ouvir as notificações keyevent
do comando delete DEL
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "run.ps1"
}
O modelo de programação v1 do Python requer que você defina as associações em um arquivo function.json separado na pasta de funções. Para saber mais, confira o Guia do desenvolvedor do Python.
Cada amostra usa o mesmo arquivo __init__.py
, com os dados vinculativos no arquivo function.json
determinando em qual canal o gatilho ocorre.
Aqui está o arquivo __init__.py
:
import logging
def main(message: str):
logging.info(message)
De function.json
:
Aqui estão os dados de associação para ouvir o canal pubsubTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "pubsubTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Aqui estão os dados de associação para ouvir as notificações do keyspace da chave keyspaceTest
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyspace@0__:keyspaceTest",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Aqui estão os dados de associação para ouvir as notificações keyevent
do comando delete DEL
.
{
"bindings": [
{
"type": "redisPubSubTrigger",
"connection": "redisConnectionString",
"channel": "__keyevent@0__:del",
"pattern": false,
"name": "message",
"direction": "in"
}
],
"scriptFile": "__init__.py"
}
Atributos
Parâmetro | Descrição | Obrigatório | Padrão |
---|---|---|---|
Connection |
O nome da configuração do aplicativo que contém a cadeia de conexão de cache, como:<cacheName>.redis.cache.windows.net:6380,password... |
Sim | |
Channel |
O canal pub sub que o gatilho deve escutar. Dá suporte a padrões de canal no estilo glob. Esse campo pode ser resolvido por meio de INameResolver . |
Sim |
Anotações
Parâmetro | Descrição | Obrigatório | Padrão |
---|---|---|---|
name |
Nome da variável que contém o valor retornado pela função. | Sim | |
connection |
O nome da configuração do aplicativo que contém a cadeia de conexão de cache, como:<cacheName>.redis.cache.windows.net:6380,password... |
Sim | |
channel |
O canal pub sub que o gatilho deve escutar. Dá suporte a padrões de canal no estilo glob. | Sim |
Configuração
Propriedade function.json | Descrição | Obrigatório | Padrão |
---|---|---|---|
type |
Tipo de gatilho. Para o gatilho pub sub, o tipo é redisPubSubTrigger . |
Sim | |
connection |
O nome da configuração do aplicativo que contém a cadeia de conexão de cache, como:<cacheName>.redis.cache.windows.net:6380,password... |
Sim | |
channel |
Nome do subcanal do pub que está sendo inscrito. | Sim | |
pattern |
Um booleano para indicar o canal fornecido usa correspondência de padrões. Se pattern for verdadeiro, o canal será tratado como um padrão de estilo glob em vez de um literal. |
Sim | |
name |
Nome da variável que contém o valor retornado pela função. | Sim | |
direction |
Deve ser definido como in . |
Sim |
Importante
O parâmetro connection
não contém a própria cadeia de conexão do cache Redis. Em vez disso, ele aponta para o nome da variável de ambiente que contém a cadeia de conexão. Isso torna o aplicativo mais seguro. Para saber mais, confira Cadeia de conexão do Redis.
Uso
O Redis apresenta a funcionalidade de publicação/assinatura que permite que as mensagens sejam enviadas ao Redis e transmitidas aos assinantes. O RedisPubSubTrigger
permite que Azure Functions sejam disparados na atividade pub/sub. O RedisPubSubTrigger
assina um padrão de canal específico usando PSUBSCRIBE
e exibe as mensagens recebidas nesses canais para a função.
Pré-requisitos e limitações
- O
RedisPubSubTrigger
não é capaz de ouvir notificações de keyspace em caches clusterizados. - As funções de camada básica não dão suporte a gatilhos em notificações
keyspace
oukeyevent
por meio doRedisPubSubTrigger
. - O
RedisPubSubTrigger
não tem suporte em um plano de consumo porque o Redis PubSub exige que os clientes sempre estejam escutando ativamente para receber todas as mensagens. Para planos de consumo, sua função pode perder determinadas mensagens publicadas no canal. - As funções com o
RedisPubSubTrigger
não devem ser escaladas horizontalmente para várias instâncias. Cada instância escuta e processa cada mensagem de subpublicação do pub, resultando em processamento duplicado.
Aviso
Esse gatilho não tem suporte em um plano de consumo porque o Redis PubSub exige que os clientes sempre estejam escutando ativamente para receber todas as mensagens. Para planos de consumo, sua função pode perder determinadas mensagens publicadas no canal.
Disparando em notificações de keyspace
O Redis oferece um conceito interno chamado notificações de keyspace. Quando habilitado, esse recurso publica notificações de uma ampla variedade de ações de cache em um canal pub/sub dedicado. As ações com suporte incluem ações que afetam chaves específicas, chamadas notificações de keyspace e comandos específicos, chamados de notificações keyevent. Há suporte para uma grande variedade de ações do Redis, como SET
, DEL
e EXPIRE
. A lista completa pode ser encontrada na documentação de notificação do keyspace.
As notificações keyspace
e keyevent
são publicadas com a seguinte sintaxe:
PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>
Como esses eventos são publicados em canais pub/sub, o RedisPubSubTrigger
é capaz de pegá-los. Consulte a seção RedisPubSubTrigger para obter mais exemplos.
Importante
Em Cache do Azure para Redis, os eventos keyspace
devem ser habilitados antes que as notificações sejam publicadas. Para obter mais informações, confira Configuração Avançada.
Type | Descrição |
---|---|
string |
A mensagem de canal serializada como JSON (UTF-8 codificada para tipos de byte) no formato a seguir. |
Custom |
O gatilho usa Json.NET serialização para mapear a mensagem do canal para o tipo personalizado fornecido. |
Formato de string JSON
{
"SubscriptionChannel":"__keyspace@0__:*",
"Channel":"__keyspace@0__:mykey",
"Message":"set"
}
Type | Descrição |
---|---|
string |
A mensagem de canal serializada como JSON (UTF-8 codificada para tipos de byte) no formato a seguir. |
Custom |
O disparo utiliza a serialização do Json.NET para mapear a mensagem do canal de um string em um tipo personalizado. |
{
"SubscriptionChannel":"__keyspace@0__:*",
"Channel":"__keyspace@0__:mykey",
"Message":"set"
}