Share via


RedisPubSubTrigger para Azure Functions (visualização)

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, Extensão Redis para Funções do Azure.

Escopo de disponibilidade para gatilhos de funções

Camada Basic Standard, Premium Enterprise, Enterprise Flash
Gatilho pub/sub Sim Sim Yes

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 do 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 tem suporte na extensão do 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 isolado, consulte 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")
                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")
                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")
                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",
      "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",
      "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",
      "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",
      "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",
      "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",
      "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",
      "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",
      "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",
      "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... Yes
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. Yes

Anotações

Parâmetro Descrição Obrigatório Padrão
name Nome da variável que contém o valor retornado pela função. Yes
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... Yes
channel O canal pub sub que o gatilho deve escutar. Dá suporte a padrões de canal no estilo glob. Yes

Configuração

Propriedade function.json Descrição Obrigatório Padrão
type Tipo de gatilho. Para o subgatilho pub, o tipo é redisPubSubTrigger. Yes
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... Yes
channel Nome do canal pub sub que está sendo assinado Yes
name Nome da variável que contém o valor retornado pela função. Yes
direction Deve ser definido como in. Yes

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 ou keyevent por meio do RedisPubSubTrigger.
  • 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 submensagem 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, DELe 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.

Tipo Descrição
string A mensagem de canal serializada como JSON (UTF-8 codificado 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 cadeia de caracteres JSON

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

Tipo Descrição
string A mensagem de canal serializada como JSON (UTF-8 codificado 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"
}