Với Cloud Functions (thế hệ thứ 2), bạn có thể kích hoạt các hàm để phản hồi tuỳ chỉnh sự kiện. Đây là những sự kiện do các nhà cung cấp sự kiện đặc biệt hoặc bổ sung cung cấp, chẳng hạn như trái ngược với các sự kiện Firebase mà SDK Firebase hỗ trợ sẵn cho Cloud Functions. Thông qua trình kích hoạt sự kiện tùy chỉnh, ứng dụng của bạn có thể phản hồi các sự kiện do Firebase Extensions hoặc bạn có thể xuất bản video tuỳ chỉnh của riêng mình các sự kiện và hàm kích hoạt để phản hồi các sự kiện đó.
Tất cả các sự kiện tùy chỉnh đều tuân thủ Định dạng sự kiện JSON trên CloudEvents và được xuất bản lên Eventarc. Eventarc có áp dụng phí sử dụng.
Kích hoạt hàm bằng sự kiện tuỳ chỉnh
Bạn có thể xuất bản sự kiện tuỳ chỉnh (hoặc nhận sự kiện từ tiện ích Firebase) và các hàm kích hoạt để phản hồi các sự kiện đó bằng cách triển khai luồng cơ bản sau:
- Xuất bản các sự kiện mong muốn lên một kênh Eventarc hoặc xác định có sẵn các sự kiện được cung cấp bởi tiện ích mà bạn đã cài đặt.
- Trong mã hàm, hãy đăng ký các sự kiện trên kênh Eventarc bằng một trình xử lý sự kiện.
- Trong hàm này, phân tích cú pháp tải trọng được trả về trong CloudEvent và thực hiện bất kỳ logic tuỳ chỉnh nào mà ứng dụng của bạn yêu cầu.
Ví dụ: một ứng dụng trò chơi có thể muốn gửi thông báo cho người dùng khi họ nhập hoặc rời khỏi bảng xếp hạng của 10 đối thủ cạnh tranh hàng đầu. Ứng dụng này có thể xuất bản các sự kiện trên bảng xếp hạng vào kênh mặc định, sau đó xử lý sự kiện trong một gửi thông báo đẩy được nhắm mục tiêu đến người dùng.
Trong một danh sách khác ví dụ: một tiện ích được thiết kế để giúp các ứng dụng xử lý hình ảnh lớn có thể phát ra sự kiện hoàn tất đổi kích thước hình ảnh. Ứng dụng đã cài đặt tiện ích này có thể xử lý sự kiện hoàn thành bằng cách cập nhật các đường liên kết trong ứng dụng để trỏ đến các phiên bản đã đổi kích thước của hình ảnh.
Xuất bản sự kiện lên kênh
Các sự kiện Eventarc được xuất bản thành
kênh.
Kênh là một cách để nhóm các sự kiện có liên quan và quản lý quyền truy cập
quyền truy cập. Khi bạn cài đặt một tiện ích hoặc triển khai một hàm sử dụng
sự kiện tùy chỉnh, Firebase sẽ tự động tạo một kênh mặc định có tên
firebase
ở khu vực us-central1
. Firebase Admin SDK cung cấp
gói con eventarc
để xuất bản lên các kênh.
Để xuất bản sự kiện từ một máy chủ đáng tin cậy (hoặc một hàm khác) bằng cách sử dụng kênh mặc định:
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 . . .'
}
});
Ngoài việc tự động tạo kênh mặc định, Firebase đặt
biến môi trường EVENTARC_CLOUD_EVENT_SOURCE
. Biến này chỉ định nguồn
của sự kiện. Nếu bạn đang xuất bản sự kiện bên ngoài Cloud Functions for Firebase,
bạn sẽ cần thêm trường source
một cách rõ ràng trong tải trọng sự kiện của mình.
Xử lý sự kiện tuỳ chỉnh
Bạn có thể xử lý tất cả các sự kiện tuỳ chỉnh, bao gồm cả sự kiện phần mở rộng, bằng
onCustomEventPublished
hoặc
on_custom_event_published
trình xử lý. Trước tiên, hãy nhập trình xử lý này từ SDK Eventarc cùng với
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
Trong mã hàm, hãy truyền vào tên sự kiện như minh hoạ cho hàm ví dụ:
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
Đối với mỗi tiện ích cụ thể, tải trọng được trả về trong đối tượng sự kiện sẽ cung cấp
mà bạn có thể sử dụng để thực hiện logic tuỳ chỉnh cho luồng ứng dụng của mình. Trong phần này
trường hợp, hàm này sử dụng Admin SDK để sao chép siêu dữ liệu về kích thước đã đổi kích thước
hình ảnh này vào một tập hợp trong Cloud Firestore, lấy tên tệp từ
subject
do sự kiện cung cấp và lưu siêu dữ liệu từ data
được cung cấp
theo sự kiện.
Xuất bản và xử lý sự kiện trên các kênh không phải kênh mặc định
Kênh tuỳ chỉnh có thể hữu ích cho các trường hợp bạn có nhu cầu đặc biệt về quyền hoặc các yêu cầu khác mà không muốn có mức độ hiển thị và truy cập giống nhau cho tất cả các sự kiện. Bạn có thể tạo kênh của riêng mình bằng cách sử dụng Bảng điều khiển Google Cloud. Việc xuất bản và đăng ký sự kiện phải được thực hiện trên cùng một kênh.
Trong trường hợp một sự kiện tuỳ chỉnh được xuất bản trên một kênh không phải kênh mặc định,
bạn cần chỉ định kênh trong mã hàm. Ví dụ: nếu bạn
muốn xử lý các sự kiện được xuất bản trong một kênh không phải kênh mặc định cho
us-west1
vị trí, bạn cần chỉ định kênh như sau:
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)
# ...