कस्टम ईवेंट ट्रिगर बनाएं और प्रबंधित करें

क्लाउड फ़ंक्शंस (दूसरी पीढ़ी) के साथ, आप कस्टम इवेंट के जवाब में फ़ंक्शन ट्रिगर कर सकते हैं। ये विशेष या अतिरिक्त इवेंट प्रदाताओं द्वारा प्रदान किए गए इवेंट हैं, जो क्लाउड फ़ंक्शंस के लिए फायरबेस एसडीके द्वारा मूल रूप से समर्थित फायरबेस इवेंट के विपरीत हैं। कस्टम ईवेंट ट्रिगर्स के माध्यम से, आपका ऐप फायरबेस एक्सटेंशन द्वारा प्रदान किए गए ईवेंट का जवाब दे सकता है, या आप अपने स्वयं के कस्टम ईवेंट प्रकाशित कर सकते हैं और उनके जवाब में फ़ंक्शन ट्रिगर कर सकते हैं।

सभी कस्टम ईवेंट CloudEvents JSON ईवेंट प्रारूप के अनुरूप हैं और ईवेंटार्क पर प्रकाशित होते हैं। इवेंटआर्क उपयोग शुल्क लागू होता है।

कस्टम ईवेंट के साथ ट्रिगर फ़ंक्शन

आप इस मूल प्रवाह को लागू करके कस्टम ईवेंट प्रकाशित कर सकते हैं (या फायरबेस एक्सटेंशन से ईवेंट प्राप्त कर सकते हैं) और उन ईवेंट के जवाब में फ़ंक्शन ट्रिगर कर सकते हैं:

  1. वांछित ईवेंट को किसी ईवेंटार्क चैनल पर प्रकाशित करें, या आपके द्वारा इंस्टॉल किए गए एक्सटेंशन द्वारा प्रदान किए गए उपलब्ध ईवेंट की पहचान करें।
  2. अपने फ़ंक्शन कोड में, इवेंट हैंडलर के साथ इवेंटर्क चैनल पर इवेंट की सदस्यता लें।
  3. फ़ंक्शन में, CloudEvent ऑब्जेक्ट में लौटाए गए पेलोड को पार्स करें और आपके ऐप को जो भी कस्टम लॉजिक चाहिए उसे निष्पादित करें।

उदाहरण के लिए, कोई गेम ऐप शीर्ष दस प्रतिस्पर्धियों के लीडरबोर्ड में प्रवेश करने या छोड़ने पर उपयोगकर्ताओं को सूचनाएं भेजना चाह सकता है। यह ऐप लीडरबोर्ड इवेंट को डिफ़ॉल्ट चैनल पर प्रकाशित कर सकता है, और फिर इवेंट को एक फ़ंक्शन में संभाल सकता है जो उपयोगकर्ताओं को लक्षित पुश नोटिफिकेशन भेजता है।

दूसरे उदाहरण में, ऐप्स को बड़ी छवियों को संसाधित करने में मदद करने के लिए डिज़ाइन किया गया एक्सटेंशन छवि का आकार बदलने के पूरा होने पर एक घटना उत्पन्न कर सकता है। जिन ऐप्स में यह एक्सटेंशन इंस्टॉल है, वे छवि के आकार वाले संस्करणों को इंगित करने के लिए ऐप में लिंक अपडेट करके पूर्णता की घटना को संभाल सकते हैं।

किसी चैनल पर कोई ईवेंट प्रकाशित करें

इवेंटार्क इवेंट चैनलों में प्रकाशित किए जाते हैं। चैनल संबंधित घटनाओं को समूहीकृत करने और पहुंच अनुमतियों को प्रबंधित करने का एक तरीका है। जब आप कोई एक्सटेंशन इंस्टॉल करते हैं या किसी फ़ंक्शन को तैनात करते हैं जो कस्टम ईवेंट का उपभोग करता है, तो फायरबेस स्वचालित रूप से us-central1 क्षेत्र में 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 . . .'
    }
});

डिफ़ॉल्ट चैनल को स्वचालित रूप से बनाने के अलावा, फायरबेस पर्यावरण चर EVENTARC_CLOUD_EVENT_SOURCE सेट करता है, जो घटना के स्रोत को निर्दिष्ट करता है। यदि आप फायरबेस के लिए क्लाउड फ़ंक्शंस के बाहर ईवेंट प्रकाशित कर रहे हैं, तो आपको अपने ईवेंट पेलोड में source फ़ील्ड को स्पष्ट रूप से जोड़ना होगा।

कस्टम ईवेंट प्रबंधित करें

आप onCustomEventPublished या on_custom_event_published हैंडलर के साथ एक्सटेंशन इवेंट सहित सभी कस्टम इवेंट को संभाल सकते हैं। सबसे पहले, इस हैंडलर को फायरबेस एडमिन एसडीके के साथ इवेंटार्क एसडीके से आयात करें:

नोड.जे.एस

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

अजगर

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

अपने फ़ंक्शन कोड में, उदाहरण फ़ंक्शन के लिए दिखाए अनुसार ईवेंट नाम दर्ज करें:

नोड.जे.एस

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

अजगर

@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

प्रत्येक विशेष एक्सटेंशन के लिए, इवेंट ऑब्जेक्ट में लौटाया गया पेलोड डेटा प्रदान करता है जिसका उपयोग आप अपने एप्लिकेशन प्रवाह के लिए कस्टम तर्क निष्पादित करने के लिए कर सकते हैं। इस मामले में, फ़ंक्शन बदली गई छवि के बारे में मेटाडेटा को क्लाउड फायरस्टोर में एक संग्रह में कॉपी करने, इवेंट द्वारा प्रदान किए गए subject से फ़ाइल नाम प्राप्त करने और इवेंट द्वारा प्रदान किए गए data से मेटाडेटा को सहेजने के लिए एडमिन एसडीके का उपयोग करता है।

गैर-डिफ़ॉल्ट चैनलों पर ईवेंट प्रकाशित करें और प्रबंधित करें

कस्टम चैनल उन मामलों के लिए उपयोगी हो सकते हैं जहां आपको विशेष अनुमति की आवश्यकता या अन्य आवश्यकताएं हैं, और आप सभी घटनाओं के लिए समान स्तर की दृश्यता और पहुंच नहीं चाहते हैं। आप Google क्लाउड कंसोल का उपयोग करके अपने स्वयं के चैनल बना सकते हैं। आयोजनों का प्रकाशन और सदस्यता एक ही चैनल पर की जानी चाहिए।

ऐसे मामलों में जहां एक कस्टम ईवेंट गैर-डिफ़ॉल्ट चैनल पर प्रकाशित होता है, आपको अपने फ़ंक्शन कोड में चैनल निर्दिष्ट करना होगा। उदाहरण के लिए, यदि आप us-west1 स्थान के लिए गैर-डिफ़ॉल्ट चैनल में प्रकाशित होने वाली घटनाओं को संभालना चाहते हैं, तो आपको दिखाए गए अनुसार चैनल निर्दिष्ट करना होगा:

नोड.जे.एस

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) => { ... });

अजगर

@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)
    # ...