Поделиться через


RedisPubSubTrigger для Функции Azure

Функции публикации и подписки Redis, позволяющие отправлять сообщения в Redis и передавать подписчикам.

Дополнительные сведения о триггерах и привязках Кэш Azure для Redis расширение Redis для Функции Azure.

Область доступности триггеров функций

Уровень Базовая Стандарт, Премиум Enterprise, Enterprise Flash
Триггер pub/sub Да Да Да

Предупреждение

Этот триггер не поддерживается в плане потребления, так как Redis PubSub требует от клиентов всегда активно прослушивать все сообщения. Для планов потребления функция может пропустить определенные сообщения, опубликованные в канале.

Внимание

Модель Node.js версии 4 для функций пока не поддерживается расширением Кэш Azure для Redis. Дополнительные сведения о том, как работает модель версии 4, см. в руководстве разработчика по Функции Azure Node.js. Дополнительные сведения о различиях между версиями 3 и 4 см. в руководстве по миграции.

Внимание

Модель Python версии 2 для функций пока не поддерживается расширением Кэш Azure для Redis. Дополнительные сведения о том, как работает модель версии 2, см. в руководстве разработчика Функции Azure Python.

Примеры

Модель выполнения Description
Изолированная рабочая модель Код функции выполняется в отдельном рабочем процессе .NET. Используйте поддерживаемые версии .NET и платформа .NET Framework. Дополнительные сведения см. в статье "Разработка изолированных рабочих процессов .NET".
Модель внутрипроцессного процесса Код функции выполняется в том же процессе, что и хост-процесс Функций. Поддерживает только долгосрочные версии .NET. Дополнительные сведения см. в статье "Разработка функций библиотеки классов .NET".

Внимание

Для функций .NET рекомендуется использовать изолированную рабочую модель для модели в процессе . Сравнение внутрипроцессных и изолированных рабочих моделей см. в различиях между изолированной рабочей моделью и внутрипроцессной моделью для .NET на Функции Azure.

Этот пример прослушивает канал 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);
        }
    }
}

Этот пример прослушивает все keyevent уведомления для команды 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.");
        }
    }
}

Этот пример прослушивает канал 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);
    }
}

Этот пример прослушивает все keyevent уведомления для команды 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);
    }
}

В этом примере используется тот же index.js файл с данными привязки в function.json файле, определяющем, на каком канале происходит триггер.

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"
}

Ниже приведены привязки данных для прослушивания keyevent уведомлений для команды DELудаления.

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

В этом примере используется тот же run.ps1 файл с данными привязки в function.json файле, определяющем, на каком канале происходит триггер.

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"
}

Ниже приведены привязки данных для прослушивания keyevent уведомлений для команды DELудаления.

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

Модель программирования Python версии 1 требует определения привязок в отдельном файле function.json в папке функции. Дополнительные сведения см. в руководстве разработчика Python.

В этом примере используется тот же __init__.py файл с данными привязки в function.json файле, определяющем, на каком канале происходит триггер.

__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"
}

Ниже приведены привязки данных для прослушивания keyevent уведомлений для команды DELудаления.

{
  "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, к которому должен прослушивать триггер. Поддерживает шаблоны каналов в стиле glob. Это поле можно разрешить с помощью INameResolver. Да

Заметки

Параметр Описание: Обязательное поле По умолчанию.
name Имя переменной, владеющей значением, возвращаемым функцией. Да
connection Имя параметра приложения, содержащего строка подключения кэша, например:<cacheName>.redis.cache.windows.net:6380,password... Да
channel Вложенный канал pub, к которому должен прослушивать триггер. Поддерживает шаблоны каналов в стиле glob. Да

Настройка

Свойство в function.json Description Обязательное поле По умолчанию.
type Тип триггера. Для под триггера pub тип .redisPubSubTrigger Да
connection Имя параметра приложения, содержащего строка подключения кэша, например:<cacheName>.redis.cache.windows.net:6380,password... Да
channel Имя подканателя паба, на который подписана подписка. Да
pattern Логическое значение, указывающее, что заданный канал использует матеширование шаблонов. Если pattern имеет значение true, канал обрабатывается как шаблон глобового стиля , а не как литерал. Да
name Имя переменной, владеющей значением, возвращаемым функцией. Да
direction Должен иметь значениеin. Да

Внимание

Параметр connection не содержит строка подключения кэш Redis. Вместо этого он указывает на имя переменной среды, содержащей строка подключения. Это делает приложение более безопасным. Дополнительные сведения см. в строка подключения Redis.

Использование

Функции публикации и подписки Redis, позволяющие отправлять сообщения в Redis и передавать подписчикам. Позволяет RedisPubSubTrigger активировать Функции Azure в действии pub/sub. Подписывается RedisPubSubTriggerна определенный шаблон канала с помощью PSUBSCRIBEи отображает сообщения, полученные на этих каналах функции.

Предварительные требования и ограничения

  • Он RedisPubSubTrigger не может прослушивать уведомления пространства ключей в кластеризованных кэшах.
  • Базовые функции уровня не поддерживают активацию keyspace или keyevent уведомления с помощью RedisPubSubTriggerфункции .
  • План RedisPubSubTrigger потребления не поддерживается, так как Redis PubSub требует, чтобы клиенты всегда активно прослушивали все сообщения. Для планов потребления функция может пропустить определенные сообщения, опубликованные в канале.
  • Функции с RedisPubSubTrigger не должны масштабироваться до нескольких экземпляров. Каждый экземпляр прослушивает и обрабатывает каждое вложенное сообщение паба, что приводит к дублированию обработки.

Предупреждение

Этот триггер не поддерживается в плане потребления, так как Redis PubSub требует от клиентов всегда активно прослушивать все сообщения. Для планов потребления функция может пропустить определенные сообщения, опубликованные в канале.

Активация уведомлений пространства ключей

Redis предлагает встроенную концепцию, называемую уведомлениями по пространству ключей. Если эта функция включена, эта функция публикует уведомления о различных действиях кэша в выделенном канале pub/sub. Поддерживаемые действия включают действия, влияющие на определенные ключи, называемые уведомлениями пространства ключей, и определенные команды, называемые уведомлениями keyevent. Поддерживается огромный спектр действий Redis, таких как SET, DELи EXPIRE. Полный список можно найти в документации по уведомлениям о пространстве ключей.

keyevent Уведомления keyspace публикуются со следующим синтаксисом:

PUBLISH __keyspace@0__:<affectedKey> <command>
PUBLISH __keyevent@0__:<affectedCommand> <key>

Так как эти события публикуются в каналах pub/sub, RedisPubSubTrigger они могут их забрать. Дополнительные примеры см. в разделе RedisPubSubTrigger .

Внимание

В Кэш Azure для Redis keyspace события должны быть включены перед публикацией уведомлений. Дополнительные сведения см. в разделе "Дополнительные параметры".

Тип Описание
string Сообщение канала, сериализованное в формате JSON (UTF-8, закодированное для типов байтов) в следующем формате.
Custom Триггер использует Json.NET сериализацию для сопоставления сообщения из канала с заданным пользовательским типом.

Формат строки JSON

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

Тип Описание
string Сообщение канала, сериализованное в формате JSON (UTF-8, закодированное для типов байтов) в следующем формате.
Custom Триггер использует сериализацию Json.NET для сопоставления сообщения из канала с string пользовательским типом.
{
  "SubscriptionChannel":"__keyspace@0__:*",
  "Channel":"__keyspace@0__:mykey",
  "Message":"set"
}