RedisPubSubTrigger لوظائف Azure

تتميز Redis بوظائف النشر/الاشتراك التي تمكن من إرسال الرسائل إلى Redis وبثها للمشتركين.

لمزيد من المعلومات حول مشغلات وروابط Azure Cache for Redis، ملحق Redis لوظائف Azure.

نطاق توفر مشغلات الوظائف

المستوى أساسي قياسي، متميز Enterprise وEnterprise Flash
مشغل Pub/Sub ‏‏نعم‬ نعم ‏‏نعم‬

تحذير

هذا المشغل غير مدعوم في خطة استهلاك لأن Redis PubSub يتطلب من العملاء الاستماع بنشاط دائما لتلقي جميع الرسائل. بالنسبة لخطط الاستهلاك، قد تفوت دالتك بعض الرسائل المنشورة على القناة.

هام

نموذج Node.js v4 للوظائف غير مدعوم حتى الآن من قبل ملحق Azure Cache for Redis. لمزيد من التفاصيل حول كيفية عمل نموذج v4، راجع دليل مطور Azure Functions Node.js. لمعرفة المزيد حول الاختلافات بين v3 وv4، راجع دليل الترحيل.

هام

نموذج Python v2 للوظائف غير مدعوم حتى الآن بواسطة ملحق Azure Cache for Redis. لمزيد من التفاصيل حول كيفية عمل نموذج v2، راجع دليل مطور Azure Functions Python.

الأمثلة

نموذج التنفيذ ‏‏الوصف
نموذج عامل معزول تعمل تعليمة دالتك البرمجية في عملية عامل .NET منفصلة. استخدم مع الإصدارات المدعومة من .NET و.NET Framework. لمعرفة المزيد، راجع تطوير وظائف معالجة العامل المعزولة .NET.
نموذج قيد المعالجة تعمل تعليمة دالتك البرمجية في نفس العملية مثل عملية مضيف الدالات. يدعم إصدارات الدعم طويل الأجل (LTS) فقط من .NET. لمعرفة المزيد، راجع تطوير وظائف مكتبة فئة .NET.

هام

بالنسبة لوظائف .NET، يوصى باستخدام نموذج العامل المعزول عبر النموذج قيد المعالجة. للمقارنة بين نماذج العامل قيد المعالجة والنموذج المعزول ، راجع الاختلافات بين نموذج العامل المعزول والنموذج قيد المعالجة ل .NET على Azure Functions.

يستمع هذا النموذج إلى القناة 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 v1 تعريف الروابط في ملف 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 القناة الفرعية للحانة التي يجب أن يستمع إليها المشغل. يدعم أنماط قناة على غرار glob. يمكن حل هذا الحقل باستخدام INameResolver. ‏‏نعم‬

تعليقات توضيحية

المعلمة الوصف مطلوبة افتراضي
name اسم المتغير الذي يحمل القيمة التي تم إرجاعها بواسطة الدالة . ‏‏نعم‬
connection اسم إعداد التطبيق الذي يحتوي على سلسلة الاتصال ذاكرة التخزين المؤقت، مثل:<cacheName>.redis.cache.windows.net:6380,password... ‏‏نعم‬
channel القناة الفرعية للحانة التي يجب أن يستمع إليها المشغل. يدعم أنماط قناة على غرار glob. ‏‏نعم‬

التكوين

خاصية function.json ‏‏الوصف مطلوبة افتراضي
type نوع المشغل. بالنسبة إلى المشغل الفرعي للحانة، يكون النوع هو redisPubSubTrigger. ‏‏نعم‬
connection اسم إعداد التطبيق الذي يحتوي على سلسلة الاتصال ذاكرة التخزين المؤقت، مثل:<cacheName>.redis.cache.windows.net:6380,password... ‏‏نعم‬
channel اسم القناة الفرعية للحانة التي يتم الاشتراك فيها. ‏‏نعم‬
pattern قيمة منطقية للإشارة إلى أن القناة المحددة تستخدم عملية حساب النمط. إذا كان pattern صحيحا، التعامل مع القناة كنمط نمط glob بدلا من أن تكون حرفية. ‏‏نعم‬
name اسم المتغير الذي يحمل القيمة التي تم إرجاعها بواسطة الدالة . ‏‏نعم‬
direction يجب تعيينه إلى in. ‏‏نعم‬

هام

connection لا تحتفظ المعلمة بذاكرة التخزين المؤقت Redis سلسلة الاتصال نفسها. بدلا من ذلك، يشير إلى اسم متغير البيئة الذي يحتوي على سلسلة الاتصال. وهذا يجعل التطبيق أكثر أمانا. لمزيد من المعلومات، راجع Redis سلسلة الاتصال.

الاستخدام

تتميز Redis بوظائف النشر/الاشتراك التي تمكن من إرسال الرسائل إلى Redis وبثها للمشتركين. يتيح RedisPubSubTrigger تشغيل Azure Functions في نشاط pub/sub. يشترك في RedisPubSubTriggerنمط قناة معين باستخدام PSUBSCRIBE، ويسطح الرسائل المستلمة على تلك القنوات إلى الوظيفة.

المتطلبات الأساسية والقيود

  • RedisPubSubTrigger غير قادر على الاستماع إلى إعلامات مساحة المفاتيح على ذاكرات التخزين المؤقت المجمعة.
  • لا تدعم وظائف المستوى الأساسي تشغيل keyspace أو keyevent الإعلامات من خلال RedisPubSubTrigger.
  • RedisPubSubTrigger لا يتم دعم في خطة الاستهلاك لأن Redis PubSub يتطلب من العملاء الاستماع بنشاط دائما لتلقي جميع الرسائل. بالنسبة لخطط الاستهلاك، قد تفوت دالتك بعض الرسائل المنشورة على القناة.
  • لا ينبغي توسيع الدوال التي RedisPubSubTrigger بها إلى مثيلات متعددة. يستمع كل مثيل ويعالج كل رسالة فرعية للحانة، ما يؤدي إلى معالجة مكررة.

تحذير

هذا المشغل غير مدعوم في خطة استهلاك لأن Redis PubSub يتطلب من العملاء الاستماع بنشاط دائما لتلقي جميع الرسائل. بالنسبة لخطط الاستهلاك، قد تفوت دالتك بعض الرسائل المنشورة على القناة.

تشغيل إعلامات مساحة المفاتيح

يقدم Redis مفهوما مضمنا يسمى إشعارات مساحة المفاتيح. عند التمكين، تنشر هذه الميزة إعلامات بمجموعة واسعة من إجراءات ذاكرة التخزين المؤقت إلى قناة pub/sub مخصصة. تتضمن الإجراءات المدعومة الإجراءات التي تؤثر على مفاتيح معينة، تسمى إعلامات مساحة المفاتيح، والأوامر المحددة، تسمى إعلامات keyevent. يتم دعم مجموعة كبيرة من إجراءات Redis، مثل SETو DELو EXPIRE. يمكن العثور على القائمة الكاملة في وثائق إعلام مساحة المفاتيح.

keyspace يتم نشر الإعلامات و keyevent باستخدام بناء الجملة التالي:

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

نظرا لنشر هذه الأحداث على قنوات النشر/القنوات الفرعية RedisPubSubTrigger ، فإن قادرا على التقاطها. راجع قسم RedisPubSubTrigger للحصول على مزيد من الأمثلة.

هام

في Azure Cache for 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"
}