ด้วย Cloud Functions (รุ่นที่ 2) คุณสามารถทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อ เหตุการณ์ที่กำหนดเอง ได้ กิจกรรมเหล่านี้เป็นกิจกรรมที่จัดทำโดยผู้ให้บริการกิจกรรมพิเศษหรือเพิ่มเติม ซึ่งตรงข้ามกับกิจกรรม Firebase ที่ Firebase SDK สำหรับฟังก์ชันคลาวด์รองรับโดยกำเนิด ด้วยทริกเกอร์เหตุการณ์ที่กำหนดเอง แอปของคุณสามารถตอบสนองต่อเหตุการณ์ที่ Firebase Extensions มอบให้ หรือคุณสามารถเผยแพร่เหตุการณ์ที่คุณกำหนดเองและทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อเหตุการณ์เหล่านั้นได้
เหตุการณ์ที่กำหนดเองทั้งหมดสอดคล้องกับ รูปแบบเหตุการณ์ CloudEvents JSON และเผยแพร่ไปยัง Eventarc มี ค่าธรรมเนียมการใช้งาน Eventarc
ทริกเกอร์ฟังก์ชันพร้อมเหตุการณ์ที่กำหนดเอง
คุณสามารถเผยแพร่เหตุการณ์ที่กำหนดเอง (หรือรับเหตุการณ์จากส่วนขยาย Firebase) และทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อเหตุการณ์เหล่านั้นได้โดยใช้โฟลว์พื้นฐานนี้:
- เผยแพร่เหตุการณ์ที่ต้องการไปยังช่อง Eventarc หรือระบุเหตุการณ์ที่มีอยู่ซึ่งจัดทำโดยส่วนขยายที่คุณได้ติดตั้ง
- ในโค้ดฟังก์ชันของคุณ ให้สมัครรับเหตุการณ์ในช่อง Eventarc ด้วยตัวจัดการเหตุการณ์
- ในฟังก์ชันนี้ ให้แยกวิเคราะห์เพย์โหลดที่ส่งคืนในออบเจ็กต์ CloudEvent และดำเนินการตรรกะแบบกำหนดเองที่แอปของคุณต้องการ
ตัวอย่างเช่น แอปเกมอาจต้องการส่งการแจ้งเตือนไปยังผู้ใช้เมื่อพวกเขาเข้าหรือออกจากกระดานผู้นำของผู้แข่งขันสิบอันดับแรก แอปนี้สามารถเผยแพร่กิจกรรมลีดเดอร์บอร์ดไปยังช่องทางเริ่มต้น จากนั้นจัดการกิจกรรมในฟังก์ชันที่ส่งการแจ้งเตือนแบบพุชที่ตรงเป้าหมายไปยังผู้ใช้
ในอีกตัวอย่างหนึ่ง ส่วนขยายที่ออกแบบมาเพื่อช่วยให้แอปประมวลผลภาพขนาดใหญ่อาจปล่อยเหตุการณ์เมื่อปรับขนาดภาพเสร็จสิ้น แอปที่ติดตั้งส่วนขยายนี้สามารถจัดการกับเหตุการณ์ที่เสร็จสิ้นได้โดยการอัปเดตลิงก์ในแอปให้ชี้ไปที่รูปภาพเวอร์ชันที่ปรับขนาดแล้ว
เผยแพร่เหตุการณ์ไปยังช่อง
กิจกรรม 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 สำหรับ Firebase คุณจะต้องเพิ่มช่อง source
ในเพย์โหลดเหตุการณ์ของคุณอย่างชัดเจน
จัดการเหตุการณ์ที่กำหนดเอง
คุณสามารถจัดการเหตุการณ์ที่กำหนดเองทั้งหมด รวมถึงเหตุการณ์ส่วนขยายด้วยตัวจัดการ onCustomEventPublished
หรือ on_custom_event_published
ขั้นแรก นำเข้าตัวจัดการนี้จาก Eventarc SDK พร้อมกับ Firebase Admin SDK:
โหนด 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");
หลาม
from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn
ในโค้ดฟังก์ชันของคุณ ให้ส่งชื่อเหตุการณ์ตามที่แสดงสำหรับฟังก์ชันตัวอย่าง:
โหนด 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
});
หลาม
@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
คุณต้องระบุช่องตามที่แสดง:
โหนด 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) => { ... });
หลาม
@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)
# ...