Tạo và xử lý trình kích hoạt sự kiện tùy chỉnh

Với Chức năng đám mây (thế hệ 2), bạn có thể kích hoạt các chức năng để phản hồi các sự kiện tùy chỉnh . Đây là những sự kiện được cung cấp bởi các nhà cung cấp sự kiện đặc biệt hoặc bổ sung, trái ngược với các sự kiện Firebase được SDK Firebase dành cho Chức năng đám mây hỗ trợ nguyên bản. 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 Tiện ích mở rộng Firebase cung cấp hoặc bạn có thể xuất bản các sự kiện tùy chỉnh và chức năng kích hoạt của riêng mình để phản hồi lại chúng.

Tất cả các sự kiện tùy chỉnh đều tuân theo định dạng sự kiện JSON của CloudEvents và được xuất bản lên Eventarc . Áp dụng phí sử dụng Eventarc.

Chức năng kích hoạt với các sự kiện tùy chỉnh

Bạn có thể xuất bản các sự kiện tùy chỉnh (hoặc nhận 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:

  1. Xuất bản các sự kiện mong muốn lên kênh Eventarc hoặc xác định các sự kiện có sẵn do tiện ích mở rộng mà bạn đã cài đặt cung cấp.
  2. Trong mã chức năng của bạn, hãy đăng ký các sự kiện trên kênh Eventarc bằng trình xử lý sự kiện.
  3. Trong hàm, 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 tùy 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ọ vào 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 lên kênh mặc định, sau đó xử lý sự kiện đó trong chức năng gửi thông báo đẩy được nhắm mục tiêu tới người dùng.

Trong một ví dụ khác, tiện ích mở rộng được thiết kế để giúp ứng dụng xử lý hình ảnh lớn có thể phát ra sự kiện khi hoàn tất việc thay đổi kích thước hình ảnh. Các ứng dụng đã cài đặt tiện ích mở rộng này có thể xử lý sự kiện hoàn thành bằng cách cập nhật các liên kết trong ứng dụng để trỏ đến các phiên bản đã thay đổi kích thước của hình ảnh.

Xuất bản sự kiện lên một kênh

Các sự kiện Eventarc được xuất bản thành 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. Khi bạn cài đặt tiện ích mở rộng hoặc triển khai chức năng sử dụng sự kiện tùy chỉnh, Firebase sẽ tự động tạo kênh mặc định có tên firebase trong khu vực us-central1 . SDK quản trị Firebase cung cấp gói phụ eventarc để xuất bản lên các kênh.

Để xuất bản một sự kiện từ máy chủ đáng tin cậy (hoặc chức năng 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 còn đặt biến môi trường EVENTARC_CLOUD_EVENT_SOURCE để chỉ định nguồn của sự kiện. Nếu bạn đang xuất bản các sự kiện bên ngoài Cloud Functions cho Firebase, bạn sẽ cần thêm trường source một cách rõ ràng vào trọng tải sự kiện của mình.

Xử lý các sự kiện tùy chỉnh

Bạn có thể xử lý tất cả các sự kiện tùy chỉnh, bao gồm cả cá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 SDK quản trị Firebase:

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 của bạn, hãy nhập tên sự kiện như hiển thị 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 mở rộng 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ể sử dụng để thực hiện logic tùy chỉnh cho luồng ứng dụng của mình. Trong trường hợp này, hàm này sử dụng SDK quản trị để sao chép siêu dữ liệu về hình ảnh đã thay đổ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ý các sự kiện trên các kênh không mặc định

Kênh tùy chỉnh có thể hữu ích trong trường hợp bạn có nhu cầu cấp phép đặc biệt 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ả cá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 . Việc xuất bản và đăng ký các sự kiện phải được thực hiện trên cùng một kênh.

Trong trường hợp sự kiện tùy chỉnh được xuất bản trên kênh không mặc định, bạn sẽ cần chỉ định kênh đó trong mã chức năng của mình. Ví dụ: nếu bạn muốn xử lý các sự kiện được xuất bản trong kênh không mặc định cho vị trí us-west1 , bạn cần chỉ định kênh như được hiển thị:

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)
    # ...