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

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

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

ทริกเกอร์ทำงานกับเหตุการณ์ที่กำหนดเอง

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

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

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

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

เผยแพร่กิจกรรมลงในช่อง

เผยแพร่เหตุการณ์ 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/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

สำหรับส่วนขยายเฉพาะแต่ละรายการ เพย์โหลดที่แสดงผลในออบเจ็กต์เหตุการณ์จะให้ ข้อมูลที่คุณสามารถใช้เพื่อดำเนินการตรรกะที่กำหนดเองสำหรับโฟลว์แอปพลิเคชันของคุณ ด้วยวิธีนี้ ฟังก์ชันจะใช้ Admin SDK เพื่อคัดลอกข้อมูลเมตาเกี่ยวกับการปรับขนาด รูปภาพไปยังคอลเล็กชันใน Cloud Firestore โดยรับชื่อไฟล์จาก subject ซึ่งระบุโดยเหตุการณ์ และบันทึกข้อมูลเมตาจาก data ที่ระบุ ข้างเหตุการณ์

เผยแพร่และจัดการเหตุการณ์ในช่องที่ไม่ใช่ค่าเริ่มต้น

แชแนลที่กำหนดเองอาจมีประโยชน์ในกรณีที่คุณต้องการสิทธิ์พิเศษ หรือข้อกำหนดอื่นๆ และไม่ต้องการระดับการเข้าถึงและสิทธิ์เข้าถึงในระดับเดียวกัน สำหรับกิจกรรมทั้งหมด คุณสามารถสร้างช่องของคุณเองโดยใช้ Google Cloud Console การเผยแพร่และการติดตามกิจกรรมต้องดำเนินการในช่องเดียวกัน

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