เมื่อใช้ Cloud Functions (รุ่นที่ 2) คุณสามารถเรียกใช้ฟังก์ชันต่างๆ เพื่อตอบสนองต่อแบบกำหนดเอง กิจกรรม กิจกรรมเหล่านี้มาจากผู้ให้บริการกิจกรรมพิเศษหรือเพิ่มเติม ตรงข้ามกับเหตุการณ์ Firebase ที่ Firebase SDK รองรับโดยค่าเริ่มต้นสำหรับ Cloud Functions แอปของคุณสามารถตอบสนองต่อเหตุการณ์ที่ให้บริการโดยผ่านทริกเกอร์เหตุการณ์ที่กำหนดเอง Firebase Extensions หรือคุณจะเผยแพร่แบบกำหนดเองก็ได้ และทริกเกอร์ฟังก์ชันต่างๆ ให้ตอบสนองต่อเหตุการณ์เหล่านั้น
เหตุการณ์ที่กำหนดเองทั้งหมดสอดคล้องกับ รูปแบบเหตุการณ์ JSON ของ CloudEvents และเผยแพร่ไปยัง Eventarc Eventarc มีค่าธรรมเนียมการใช้งาน
ทริกเกอร์ทำงานกับเหตุการณ์ที่กำหนดเอง
คุณสามารถเผยแพร่เหตุการณ์ที่กำหนดเอง (หรือรับเหตุการณ์จากส่วนขยาย Firebase) และ ทริกเกอร์ฟังก์ชันต่างๆ ให้ตอบสนองต่อเหตุการณ์เหล่านั้นด้วยการใช้ขั้นตอนพื้นฐานนี้
- เผยแพร่กิจกรรมที่ต้องการไปยังช่องทาง Eventarc หรือระบุว่ามี ที่มาจากส่วนขยายที่คุณติดตั้ง
- ในรหัสฟังก์ชัน ให้สมัครรับข้อมูลกิจกรรมในช่อง Eventarc ด้วย เครื่องจัดการเหตุการณ์
- ในฟังก์ชัน ให้แยกวิเคราะห์เพย์โหลดที่แสดงผลใน 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)
# ...