Compartilhar via


RedisStreamTrigger para Azure Functions

O RedisStreamTrigger faz a leitura de novas entradas de um fluxo e coloca esses elementos na superfície da função.

Escopo de disponibilidade para gatilhos de funções

Tipo de gatilho Redis Gerenciado do Azure Cache do Azure para Redis
Fluxos 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.

Importante

No momento, não há suporte para os gatilhos do Redis para funções em execução no Plano de Consumo.

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.

Exemplo

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.

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.
using Microsoft.Extensions.Logging;

namespace Microsoft.Azure.Functions.Worker.Extensions.Redis.Samples.RedisStreamTrigger
{
    internal class SimpleStreamTrigger
    {
        private readonly ILogger<SimpleStreamTrigger> logger;

        public SimpleStreamTrigger(ILogger<SimpleStreamTrigger> logger)
        {
            this.logger = logger;
        }

        [Function(nameof(SimpleStreamTrigger))]
        public void Run(
            [RedisStreamTrigger(Common.connectionStringSetting, "streamKey")] string entry)
        {
            logger.LogInformation(entry);
        }
    }
}

package com.function.RedisStreamTrigger;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.redis.annotation.*;

public class SimpleStreamTrigger {
    @FunctionName("SimpleStreamTrigger")
    public void run(
            @RedisStreamTrigger(
                name = "req",
                connection = "redisConnectionString",
                key = "streamTest",
                pollingIntervalInMs = 1000,
                maxBatchSize = 1)
                String message,
            final ExecutionContext context) {
            context.getLogger().info(message);
    }
}

Esta amostra utiliza o mesmo arquivo index.js, com dados de associação no arquivo function.json.

Aqui está o arquivo index.js:

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

De function.json, aqui estão os dados de associação:

{
  "bindings": [
    {
      "type": "redisStreamTrigger",
      "connection": "redisConnectionString",
      "key": "streamTest",
      "pollingIntervalInMs": 1000,
      "maxBatchSize": 16,
      "name": "entry",
      "direction": "in"
    }
  ],
  "scriptFile": "index.js"
}

Esta amostra utiliza o mesmo arquivo run.ps1, com dados de associação no arquivo function.json.

Aqui está o arquivo run.ps1:

param($entry, $TriggerMetadata)
Write-Host ($entry | ConvertTo-Json)

De function.json, aqui estão os dados de associação:

{
  "bindings": [
    {
      "type": "redisStreamTrigger",
      "connection": "redisConnectionString",
      "key": "streamTest",
      "pollingIntervalInMs": 1000,
      "maxBatchSize": 16,
      "name": "entry",
      "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.

Esta amostra utiliza o mesmo arquivo __init__.py, com dados de associação no arquivo function.json.

Aqui está o arquivo __init__.py:

import logging

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

De function.json, aqui estão os dados de associação:

{
  "bindings": [
    {
      "type": "redisStreamTrigger",
      "connection": "redisConnectionString",
      "key": "streamTest",
      "pollingIntervalInMs": 1000,
      "maxBatchSize": 16,
      "name": "entry",
      "direction": "in"
    }
  ],
  "scriptFile": "__init__.py"
}

Atributos

Parâmetros 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
Key Chave da qual fazer a leitura. Sim
PollingIntervalInMs Com que frequência sondar o servidor Redis em milissegundos. Opcional 1000
MessagesPerWorker O número de mensagens que cada trabalhador de funções deve processar. Usado para determinar para quantos trabalhos a função deve ser dimensionada. Opcional 100
Count Número de elementos a serem extraídos do Redis de uma só vez. Opcional 10
DeleteAfterProcess Indica se a função exclui as entradas do fluxo após o processamento. Opcional false

Anotações

Parâmetro Descrição Obrigatório Padrão
name entry 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
key Chave da qual fazer a leitura. Sim
pollingIntervalInMs Com que frequência realizar a verificação no Redis, em milissegundos. Opcional 1000
messagesPerWorker O número de mensagens que cada trabalhador de funções deve processar. Ele é usado para determinar para quantos trabalhadores a função deve ser dimensionada. Opcional 100
count Número de entradas para fazer a leitura do Redis de uma só vez. As entradas são processadas em paralelo. Opcional 10
deleteAfterProcess Se as entradas de fluxo devem ser excluídas após a execução da função. Opcional false

Configuração

A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json.

Propriedades do function.json Descrição Obrigatório Padrão
type Sim
deleteAfterProcess Opcional false
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
key A chave para fazer a leitura. Sim
pollingIntervalInMs Com que frequência realizar a verificação no Redis, em milissegundos. Opcional 1000
messagesPerWorker (opcional) O número de mensagens que cada trabalhador de funções deve processar. Utilizado para determinar quantos operadores a função deve escalar Opcional 100
count Número de entradas para fazer a leitura do Redis de uma só vez. Eles são processados em paralelo. Opcional 10
name Sim
direction Sim

Consulte a Seção de exemplo para obter exemplos completos.

Uso

A RedisStreamTrigger Azure Functions faz a leitura de novas entradas de um fluxo e coloca essas entradas na superfície da função.

O gatilho sonda o Redis em um intervalo fixo configurável e usa para ler elementos XREADGROUP do fluxo.

O grupo de consumidores para todas as instâncias de uma função é o nome da função, ou seja, SimpleStreamTrigger para o exemplo StreamTrigger.

Cada instância de funções usa o WEBSITE_INSTANCE_ID ou gera um GUID aleatório para usar como seu nome de consumidor dentro do grupo para garantir que as instâncias expandidas da função não leiam as mesmas mensagens do fluxo.

Tipo Descrição
byte[] A mensagem do canal.
string A mensagem do canal.
Custom O disparo utiliza a serialização do Json.NET para mapear a mensagem do canal de um string em um tipo personalizado.