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