สร้างและจัดการทริกเกอร์เหตุการณ์ที่กำหนดเอง

Cloud Functions (รุ่นที่ 2) ช่วยให้คุณทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อ เหตุการณ์ที่กำหนดเองได้Cloud Functions ซึ่งเป็นเหตุการณ์ที่ผู้ให้บริการเหตุการณ์พิเศษหรือเพิ่มเติมเป็นผู้จัดหาให้ ไม่ใช่เหตุการณ์ Firebase ที่ Firebase SDK สำหรับ Cloud Functions รองรับโดยเนทีฟ ทริกเกอร์เหตุการณ์ที่กำหนดเองช่วยให้แอปตอบสนองต่อเหตุการณ์ที่ Firebase Extensionsจัดหาให้ได้ หรือคุณจะเผยแพร่เหตุการณ์ที่กำหนดเอง และทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อเหตุการณ์เหล่านั้นก็ได้

เหตุการณ์ที่กำหนดเองทั้งหมดเป็นไปตาม รูปแบบเหตุการณ์ JSON ของ CloudEvents และเผยแพร่ไปยัง Eventarc Eventarc จะมีค่าธรรมเนียมการใช้งาน

ทริกเกอร์ฟังก์ชันด้วยเหตุการณ์ที่กำหนดเอง

คุณสามารถเผยแพร่เหตุการณ์ที่กำหนดเอง (หรือรับเหตุการณ์จาก Firebase Extensions) และทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อเหตุการณ์เหล่านั้นได้โดยใช้โฟลว์พื้นฐานต่อไปนี้

  1. เผยแพร่เหตุการณ์ที่ต้องการไปยังแชแนล Eventarc หรือระบุเหตุการณ์ที่มีให้บริการซึ่งจัดหาให้โดยส่วนขยายที่คุณติดตั้ง
  2. ในโค้ดฟังก์ชัน ให้สมัครรับข้อมูลเหตุการณ์ในแชแนล Eventarc ด้วยตัวจัดการเหตุการณ์
  3. ในฟังก์ชัน ให้แยกวิเคราะห์เพย์โหลดที่ส่งคืนในออบเจ็กต์ CloudEvent และดำเนินการตรรกะที่กำหนดเองที่แอปต้องการ

ตัวอย่างเช่น แอปเกมอาจต้องการส่งการแจ้งเตือนไปยังผู้ใช้เมื่อผู้ใช้เข้าหรือออกจากลีดเดอร์บอร์ดของผู้เข้าแข่งขัน 10 อันดับแรก แอปนี้สามารถเผยแพร่เหตุการณ์ลีดเดอร์บอร์ดไปยังแชแนลเริ่มต้น แล้วจัดการเหตุการณ์ในฟังก์ชันที่ส่งการแจ้งเตือนแบบพุชที่กำหนดเป้าหมายไปยังผู้ใช้

อีกตัวอย่างหนึ่งคือ ส่วนขยายที่ออกแบบมาเพื่อช่วยให้แอปประมวลผลรูปภาพขนาดใหญ่อาจปล่อยเหตุการณ์เมื่อการปรับขนาดรูปภาพเสร็จสมบูรณ์ แอปที่ติดตั้งส่วนขยายนี้สามารถจัดการเหตุการณ์การเสร็จสมบูรณ์ได้โดยการอัปเดตลิงก์ในแอปให้ชี้ไปยังรูปภาพเวอร์ชันที่ปรับขนาดแล้ว

เผยแพร่เหตุการณ์ไปยังแชแนล

ระบบจะเผยแพร่เหตุการณ์ Eventarc ไปยัง แชแนล แชแนลเป็นวิธีจัดกลุ่มเหตุการณ์ที่เกี่ยวข้องและจัดการสิทธิ์เข้าถึง เมื่อคุณติดตั้งส่วนขยายหรือทำให้ฟังก์ชันที่ใช้เหตุการณ์ที่กำหนดเองใช้งานได้ Firebase จะสร้างแชแนลเริ่มต้นชื่อ firebase ในภูมิภาค us-central1 โดยอัตโนมัติ Firebase Admin SDK มี แพ็กเกจย่อย 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 พร้อมกับ Firebase Admin SDK ดังนี้

Node.js

const {onCustomEventPublished} = require("firebase-functions/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

สำหรับส่วนขยายแต่ละรายการ เพย์โหลดที่ส่งคืนในออบเจ็กต์เหตุการณ์จะให้ข้อมูลที่คุณใช้เพื่อดำเนินการตรรกะที่กำหนดเองสำหรับโฟลว์แอปพลิเคชันได้ ในกรณีนี้ ฟังก์ชันจะใช้ Admin 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)
    # ...