Partilhar via


RedisPubSubTrigger para Azure Functions

O Redis possui a funcionalidade de publicação/assinatura que permite que as mensagens sejam enviadas para o Redis e transmitidas aos assinantes.

Para obter mais informações sobre gatilhos e associações do Cache do Azure para Redis, a Extensão do Redis para Azure Functions.

Âmbito de disponibilidade para acionadores de funções

Escalão de serviço Básica Standard, Premium Empresa, Enterprise Flash
Pub/Sub Gatilho Sim Sim Sim

Aviso

Esse gatilho não é suportado em um plano de consumo porque o Redis PubSub exige que os clientes estejam sempre ouvindo 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 é suportado pela extensão Cache do Azure para Redis. Para obter mais detalhes sobre como o modelo v4 funciona, consulte o Guia do desenvolvedor do Azure Functions Node.js. Para saber mais sobre as diferenças entre v3 e v4, consulte o guia de migração.

Importante

O modelo Python v2 para Functions ainda não é suportado pela extensão Cache for Redis do Azure. Para obter mais detalhes sobre como o modelo v2 funciona, consulte o guia do desenvolvedor Python do Azure Functions.

Exemplos

Modelo de execução Description
Modelo de trabalhador isolado Seu código de função é executado em um processo de trabalho .NET separado. Use com versões suportadas do .NET e .NET Framework. Para saber mais, consulte Desenvolver funções de processo de trabalho isoladas do .NET.
Modelo em processo Seu código de função é executado no mesmo processo que o processo de host de funções. Suporta apenas versões LTS (Long Term Support) do .NET. Para saber mais, consulte Desenvolver funções de biblioteca de classes .NET.

Importante

Para funções .NET, o uso do modelo de trabalho isolado é recomendado sobre o modelo em processo . Para obter uma comparação dos modelos de trabalho em processo e isolado, consulte as diferenças entre o modelo de trabalhador isolado e o modelo em processo para .NET no Azure Functions.

Este exemplo ouve 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);
        }
    }
}

Este exemplo escuta todas as notificações de espaço de chave para a 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);
        }
    }
}

Este exemplo escuta todas keyevent as notificações para o comando DELdelete .

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 ouve 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);
    }
}

Este exemplo escuta todas as notificações de espaço de chave para a 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);
    }
}

Este exemplo escuta todas keyevent as notificações para o comando DELdelete .

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);
    }
}

Este exemplo usa o mesmo index.js arquivo, com dados de vinculação no arquivo determinando em qual canal o gatilho function.json ocorre.

Aqui está o index.js arquivo:

module.exports = async function (context, message) {
    context.log(message);
}

De function.json:

Aqui está a vinculação de dados 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 vinculação para ouvir as notificações de espaço de chave para a chave keyspaceTest.

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

Aqui está a vinculação de dados para ouvir keyevent notificações para o comando DELdelete .

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

Este exemplo usa o mesmo run.ps1 arquivo, com dados de vinculação no arquivo determinando em qual canal o gatilho function.json ocorre.

Aqui está o run.ps1 arquivo:

param($message, $TriggerMetadata)
Write-Host $message

De function.json:

Aqui está a vinculação de dados 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 vinculação para ouvir as notificações de espaço de chave para a chave keyspaceTest.

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

Aqui está a vinculação de dados para ouvir keyevent notificações para o comando DELdelete .

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

O modelo de programação Python v1 requer que você defina ligações em um arquivo function.json separado na pasta de funções. Para obter mais informações, consulte o guia do desenvolvedor do Python.

Este exemplo usa o mesmo __init__.py arquivo, com dados de vinculação no arquivo determinando em qual canal o gatilho function.json ocorre.

Aqui está o __init__.py arquivo:

import logging

def main(message: str):
    logging.info(message)

De function.json:

Aqui está a vinculação de dados 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 vinculação para ouvir as notificações de espaço de chave para a chave keyspaceTest.

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

Aqui está a vinculação de dados para ouvir keyevent notificações para o comando DELdelete .

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

Atributos

Parâmetro Descrição Necessário Predefiniçã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 subcanal pub que o gatilho deve ouvir. Suporta padrões de canal no estilo glob. Este campo pode ser resolvido usando INameResolver. Sim

Anotações

Parâmetro Descrição Necessário Predefiniçã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 subcanal pub que o gatilho deve ouvir. Suporta padrões de canal no estilo glob. Sim

Configuração

function.json propriedade Description Necessário Predefinição
type Tipo de gatilho. Para o subgatilho pub, 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 pub que está sendo inscrito 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 connection parâmetro não contém a cadeia de conexão de cache Redis em si. 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 obter mais informações, consulte Cadeia de conexão Redis.

Utilização

O Redis possui a funcionalidade de publicação/assinatura que permite que as mensagens sejam enviadas para o Redis e transmitidas aos assinantes. O RedisPubSubTrigger permite que o Azure Functions seja acionado na atividade pub/sub. O RedisPubSubTriggerassina um padrão de canal específico usando PSUBSCRIBE, e exibe mensagens recebidas nesses canais para a função.

Pré-requisitos e limitações

  • O RedisPubSubTrigger não é capaz de ouvir notificações de espaço de chave em caches clusterizados.
  • As funções básicas da camada não suportam acionamento keyspace ou keyevent notificações por meio do RedisPubSubTrigger.
  • O RedisPubSubTrigger não é suportado em um plano de consumo porque o Redis PubSub exige que os clientes estejam sempre ouvindo 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 dimensionadas para várias instâncias. Cada instância escuta e processa cada submensagem pub, resultando em processamento duplicado.

Aviso

Esse gatilho não é suportado em um plano de consumo porque o Redis PubSub exige que os clientes estejam sempre ouvindo ativamente para receber todas as mensagens. Para planos de consumo, sua função pode perder determinadas mensagens publicadas no canal.

Acionamento em notificações de espaço de chave

O Redis oferece um conceito integrado chamado notificações keyspace. Quando ativado, esse recurso publica notificações de uma ampla gama de ações de cache em um pub/subcanal dedicado. As ações suportadas incluem ações que afetam chaves específicas, chamadas notificações keyspace, e comandos específicos, chamadas notificações keyevent. Uma grande variedade de ações Redis são apoiadas, como SET, DELe EXPIRE. A lista completa pode ser encontrada na documentação de notificação do keyspace.

As keyspace notificações 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 pubs / subcanais, o RedisPubSubTrigger é capaz de pegá-los. Consulte a seção RedisPubSubTrigger para obter mais exemplos.

Importante

No Cache do Azure para Redis, keyspace os eventos devem ser habilitados antes que as notificações sejam publicadas. Para obter mais informações, consulte Configurações avançadas.

Tipo Description
string A mensagem do 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 Description
string A mensagem do 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 de um string para um tipo personalizado.
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}