إنشاء عوامل تشغيل الأحداث المخصّصة والتعامل معها

باستخدام دوال Cloud (الجيل الثاني)، يمكنك تفعيل الوظائف استجابةً الأحداث. وهذه هي الأحداث التي يقدمها موفرو أحداث خاصون أو إضافيون، مثل مقارنةً بأحداث Firebase التي تتوافق في الأصل مع حزمة تطوير البرامج (SDK) لمنصّة Firebase لوظائف السحابة الإلكترونية. من خلال عوامل تشغيل الأحداث المخصّصة، يمكن لتطبيقك الاستجابة إلى الأحداث المقدَّمة من إضافات Firebase أو يمكنك نشر مجموعتك الخاصة الأحداث وشغِّل الدوال استجابةً لها.

تتوافق جميع الأحداث المخصّصة مع تنسيق حدث Cloud Events JSON ويتم نشرها في Eventarc. إيفينتارك رسوم الاستخدام.

تشغيل الدوال باستخدام الأحداث المخصّصة

ويمكنك نشر أحداث مخصّصة (أو الحصول على أحداث من إضافات Firebase) وكذلك تشغيل الدوال استجابة لتلك الأحداث من خلال تنفيذ هذا التدفق الأساسي:

  1. انشر الأحداث المطلوبة على قناة Eventarc أو حدِّد الأحداث المتاحة. الأحداث التي تقدمها إحدى الإضافات التي ثبَّتها.
  2. في رمز الدالة، اشترِك في الأحداث على قناة Eventarc باستخدام معالج حدث.
  3. في الدالة، حلّل الحمولة التي تم إرجاعها في كائن CloudEvent وتنفيذ أي منطق مخصَّص يتطلبه تطبيقك.

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

وفي صورة أخرى، على سبيل المثال، قد تنبعث من إضافة مصممة لمساعدة التطبيقات في معالجة الصور الكبيرة الحدث عند اكتمال تغيير حجم الصور. تم تثبيت التطبيقات التي تتضمّن هذه الإضافة معالجة حدث الاكتمال من خلال تحديث الروابط في التطبيق للإشارة إلى النسخ التي تم تغيير حجمها من الصورة.

نشر حدث في قناة

يتم نشر أحداث Eventarc في القنوات. القنوات هي طريقة لتجميع الأحداث ذات الصلة وإدارة أذونات الوصول إليها الأذونات. عندما تثبّت إضافة أو تنشر دالة تستهلك أحداث مخصصة، ينشئ Firebase تلقائيًا قناة تلقائية باسم firebase في منطقة us-central1 توفّر حزمة تطوير البرامج (SDK) لمشرف Firebase حزمة فرعية eventarc للنشر على القنوات

لنشر حدث من خادم موثوق به (أو من دالة أخرى) باستخدام القناة التلقائية:

import {getEventarc} from 'firebase-admin/eventarc';

getEventarc().channel().publish({
    type: 'achieved-leaderboard',
    subject: 'Welcome to the top 10',
    data: {
      message: 'You have achieved the nth position in our leaderboard!  To see . . .'
    }
});

بالإضافة إلى إنشاء القناة الافتراضية تلقائيًا، يعيّن Firebase متغير البيئة EVENTARC_CLOUD_EVENT_SOURCE، الذي يحدد المصدر من الفعالية. إذا كنت تنشر أحداثًا خارج Cloud Functions for Firebase، عليك إضافة الحقل source بشكل صريح في حمولة الحدث.

التعامل مع الأحداث المخصّصة

يمكنك التعامل مع جميع الأحداث المخصّصة، بما في ذلك أحداث الإضافات، من خلال onCustomEventPublished أو on_custom_event_published فقط. أولاً، استورد هذا المعالج من Eventarc SDK إلى جانب SDK لمشرف Firebase:

Node.js

const {onCustomEventPublished} = require("firebase-functions/v2/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

Python

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

في رمز الدالة، أدخِل اسم الحدث كما هو موضّح للدالة المثالية:

Node.js

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, write resized image details into Firestore.
      return getFirestore()
          .collection("images")
          .doc(event.subject.replace("/", "_")) // original file path
          .set(event.data); // resized images paths and sizes
    });

Python

@eventarc_fn.on_custom_event_published(
    event_type="firebase.extensions.storage-resize-images.v1.complete")
def onimageresized(event: eventarc_fn.CloudEvent) -> None:
    print("Received image resize completed event: ", event.type)

    if not isinstance(event.subject, str):
        print("No 'subject' data.")
        return

    # For example, write resized image details into Firestore.
    firestore_client: google.cloud.firestore.Client = firestore.client()
    collection = firestore_client.collection("images")
    doc = collection.document(event.subject.replace("/", "_"))  # original file path
    doc.set(event.data)  # resized images paths and sizes

بالنسبة إلى كل إضافة معيّنة، توفِّر الحمولة التي يتم عرضها في كائن الحدث بيانات يمكنك استخدامها لتنفيذ منطق مخصّص لتدفق تطبيقك. في هذه الدورة، الحالة، تستخدم الدالة حزمة تطوير البرامج (SDK) الخاصة بالمشرف لنسخ البيانات الوصفية حول البيانات الوصفية صورة إلى مجموعة في Cloud Firestore، ويتم الحصول على اسم الملف من subject التي يوفّرها الحدث وحفظ البيانات الوصفية من data المقدَّمة حسب الحدث.

نشر الأحداث والتعامل معها على القنوات غير التلقائية

يمكن الاستفادة من القنوات المخصّصة في الحالات التي يكون لديك فيها احتياجات خاصة بشأن الأذونات أو متطلبات أخرى، ولا يريدون المستوى نفسه من مستوى الرؤية والوصول لجميع الأحداث. يمكنك إنشاء قنواتك الخاصة باستخدام وحدة تحكُّم Google Cloud يجب أن يتم نشر الأحداث والاشتراك فيها على القناة نفسها.

في الحالات التي يتمّ فيها نشر حدث مخصّص على قناة غير تلقائية، عليك تحديد القناة في رمز الدالة. على سبيل المثال، إذا تريد معالجة الأحداث التي يتم نشرها في قناة غير تلقائية موقع us-west1 الجغرافي، يجب تحديد القناة على النحو الموضّح:

Node.js

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const func = onCustomEventPublished(
    {
      eventType: "firebase.extensions.storage-resize-images.v1.complete",
      channel: "locations/us-west1/channels/firebase",
      region: "us-west1",
    },
    (event) => { ... });

Python

@eventarc_fn.on_custom_event_published(
    event_type="firebase.extensions.storage-resize-images.v1.complete",
    channel="locations/us-west1/channels/firebase",
    region="us-west1")
def onimageresizedwest(event: eventarc_fn.CloudEvent) -> None:
    print("Received image resize completed event: ", event.type)
    # ...