Cloud Functions (2. nesil) ile özel etkinliklere yanıt olarak işlevleri tetikleyebilirsiniz. Bunlar, Cloud Functions için Firebase SDK'sı tarafından doğal olarak desteklenen Firebase etkinliklerinin aksine, özel veya ek etkinlik sağlayıcılar tarafından sağlanan etkinliklerdir. Uygulamanız, özel etkinlik tetikleyicileri aracılığıyla Firebase Extensions tarafından sağlanan etkinliklere yanıt verebilir veya kendi özel etkinliklerinizi yayınlayıp bunlara yanıt olarak işlevleri tetikleyebilirsiniz.
Tüm özel etkinlikler CloudEvents JSON etkinlik biçimine uygundur ve Eventarc adresinde yayınlanır. Eventarc Kullanım ücretleri geçerlidir.
Özel etkinliklerle işlevleri tetikleme
Özel etkinlikler yayınlayabilir (veya Firebase uzantılarından etkinlik alabilir) ve bu etkinliklere yanıt olarak işlevleri tetiklemek için aşağıdaki temel akışı uygulayabilirsiniz:
- İstediğiniz etkinlikleri bir Eventarc kanalında yayınlayın veya yüklediğiniz bir uzantı tarafından sağlanan mevcut etkinlikleri tanımlayın.
- İşlev kodunuzda, bir etkinlik işleyiciyle Eventarc kanalındaki etkinliklere abone olun.
- İşlevde, CloudEvent nesnesinde döndürülen yük verisini ayrıştırın ve uygulamanızın gerektirdiği özel mantığı gerçekleştirin.
Örneğin, bir oyun uygulaması, ilk on yarışmacının yer aldığı liderlik tablosuna girip çıkan kullanıcılara bildirim göndermek isteyebilir. Bu uygulama, liderlik tablosu etkinliklerini varsayılan kanalda yayınlayabilir ve ardından etkinliği, kullanıcılara hedefli push bildirimleri gönderen bir işlevde işleyebilir.
Başka bir örnekte, uygulamaların büyük resimleri işlemesine yardımcı olmak için tasarlanmış bir uzantı, resim yeniden boyutlandırma işlemi tamamlandığında bir etkinlik yayınlayabilir. Bu uzantının yüklü olduğu uygulamalar, uygulamadaki bağlantıları resmin yeniden boyutlandırılmış sürümlerine yönlendirecek şekilde güncelleyerek tamamlama etkinliğini işleyebilir.
Bir etkinliği kanalda yayınlama
Eventarc etkinlikleri kanallara yayınlanır.
Kanallar, ilgili etkinlikleri gruplandırmanın ve erişim izinlerini yönetmenin bir yoludur. Bir uzantı yüklediğinizde veya özel etkinlikler kullanan bir işlev dağıttığınızda Firebase, us-central1
bölgesinde firebase
adlı bir varsayılan kanal oluşturur. Firebase Admin SDK, kanallarda yayınlamak için eventarc
alt paketi sağlar.
Varsayılan kanalı kullanarak güvenilir bir sunucudan (veya başka bir işlevden) etkinlik yayınlamak için:
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, varsayılan kanalı otomatik olarak oluşturmanın yanı sıra etkinliğin kaynağını belirten EVENTARC_CLOUD_EVENT_SOURCE
ortam değişkenini de ayarlar. Cloud Functions for Firebase dışında etkinlik yayınlıyorsanız etkinlik yükünüze source
alanını açıkça eklemeniz gerekir.
Özel etkinlikleri işleme
Uzantıların etkinlikleri dahil tüm özel etkinlikleri onCustomEventPublished
veya on_custom_event_published
işleyicileriyle işleyebilirsiniz. Öncelikle bu işleyiciyi Eventarc SDK'sından aşağıdakilerle birlikte içe aktarın: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
İşlev kodunuzda, örnek işlevde gösterildiği gibi etkinlik adını iletin:
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
Belirli her bir uzantı için etkinlik nesnesinde döndürülen yük, uygulama akışınız için özel mantık yürütmek üzere kullanabileceğiniz veriler sağlar. Bu durumda işlev, yeniden boyutlandırılmış resimle ilgili meta verileri Cloud Firestore içindeki bir koleksiyona kopyalamak için Admin SDK'ü kullanır. İşlev, dosya adını etkinlik tarafından sağlanan subject
öğesinden alır ve meta verileri etkinlik tarafından sağlanan data
öğesinden kaydeder.
Varsayılan olmayan kanallarda etkinlik yayınlama ve yönetme
Özel kanallar, özel izin ihtiyaçlarınız veya başka şartlarınız olduğunda ve tüm etkinlikler için aynı düzeyde görünürlük ve erişim istemediğiniz durumlarda yararlı olabilir. Google Cloud Console'u kullanarak kendi kanallarınızı oluşturabilirsiniz. Etkinliklerin yayınlanması ve etkinliklere abone olunması aynı kanalda yapılmalıdır.
Özel bir etkinliğin varsayılan olmayan bir kanalda yayınlandığı durumlarda işlev kodunuzda kanalı belirtmeniz gerekir. Örneğin, us-west1
konumu için varsayılan olmayan bir kanalda yayınlanan etkinlikleri işlemek istiyorsanız kanalı aşağıdaki gibi belirtmeniz gerekir:
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)
# ...