Menulis fungsi berbasis peristiwa

Di Cloud Functions, Anda menggunakan fungsi berbasis peristiwa saat Anda ingin fungsi dipanggil secara otomatis sebagai respons terhadap peristiwa yang terjadi di lingkungan cloud Anda.

Ada dua cara untuk menerapkan fungsi berbasis peristiwa. Cara yang Anda gunakan bergantung pada runtime bahasa yang dipilih dan apakah Anda menggunakan Cloud Functions (generasi ke-1) atau Cloud Functions (generasi ke-2):

Fungsi CloudEvent

Fungsi CloudEvent didasarkan pada CloudEvents, yaitu sebuah spesifikasi standar industri untuk mendeskripsikan data peristiwa dengan cara yang umum. Anda dapat mempelajari spesifikasi CloudEvent lebih lanjut di repositori GitHub CloudEvent. Project CloudEvents juga menyediakan sekumpulan CloudEvent SDK untuk membantu menangani objek CloudEvents dalam kode Anda.

Contoh berikut menunjukkan file sumber fungsi CloudEvent dasar untuk setiap runtime. Lihat Struktur direktori sumber untuk mengetahui informasi tentang lokasi kode sumber.

Node.js

const functions = require('@google-cloud/functions-framework');

// Register a CloudEvent function with the Functions Framework
functions.cloudEvent('myCloudEventFunction', cloudEvent => {
  // Your code here
  // Access the CloudEvent data payload via cloudEvent.data
});

Di Node.js, Anda mendaftarkan fungsi pengendali CloudEvent dengan Functions Framework untuk Node.js. Fungsi pengendali Anda harus menerima objek CloudEvent sebagai argumen.

Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework. Dalam contoh ini, titik masuknya adalah myCloudEventFunction.

Python

import functions_framework

# Register a CloudEvent function with the Functions Framework
@functions_framework.cloud_event
def my_cloudevent_function(cloud_event):
  # Your code here
  # Access the CloudEvent data payload via cloud_event.data

Dalam Python, Anda mendaftarkan fungsi pengendali CloudEvent dengan Functions Framework untuk Python. Fungsi pengendali Anda harus menerima objek CloudEvent sebagai argumen.

Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework. Dalam contoh ini, titik masuknya adalah my_cloudevent_function.

Go

package mycloudeventfunction

import (
    "context"

    "github.com/GoogleCloudPlatform/functions-framework-go/functions"
    "github.com/cloudevents/sdk-go/v2/event"
)

func init() {
    // Register a CloudEvent function with the Functions Framework
    functions.CloudEvent("MyCloudEventFunction", myCloudEventFunction)
}

// Function myCloudEventFunction accepts and handles a CloudEvent object
func myCloudEventFunction(ctx context.Context, e event.Event) error {
    // Your code here
    // Access the CloudEvent data payload via e.Data() or e.DataAs(...)

    // Return nil if no error occurred
    return nil
}

Di Go, Anda mendaftarkan fungsi pengendali CloudEvent dengan Functions Framework untuk Go. Fungsi pengendali Anda harus menerima CloudEvent event.Event sebagai argumen.

Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework. Dalam contoh ini, titik masuknya adalah MyCloudEventFunction.

Java

package mycloudeventfunction;

import com.google.cloud.functions.CloudEventsFunction;
import io.cloudevents.CloudEvent;

// Define a class that implements the CloudEventsFunction interface
public class MyCloudEventFunction implements CloudEventsFunction {
  // Implement the accept() method to handle CloudEvents
  @Override
  public void accept(CloudEvent event) {
    // Your code here
    // Access the CloudEvent data payload via event.getData()
    // To get the data payload as a JSON string, use:
    // new String(event.getData().toBytes())
  }
}

Di Java, Anda menggunakan Functions Framework Java API untuk mengimplementasikan class pengendali CloudEvent dengan antarmuka CloudEventsFunction. Metode accept() harus menerima objek CloudEvent sebagai argumen dan melakukan pemrosesan apa pun pada peristiwa.

Titik entri fungsi adalah nama yang sepenuhnya memenuhi syarat untuk class pengendali CloudEvent, termasuk nama paket. Dalam contoh ini, titik masuknya adalah mycloudeventfunction.MyCloudEventFunction.

C#

using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using System.Threading;
using System.Threading.Tasks;

namespace MyProject
{
    // Define a class that implements the ICloudEventFunction<T> interface
    public class MyCloudEventFunction : ICloudEventFunction<CloudEventDataType>
    {
        // Implement the HandleAsync() method to handle CloudEvents
        public Task HandleAsync(CloudEvent cloudEvent, CloudEventDataType data, CancellationToken cancellationToken)
        {
            // Your code here
            // The data argument represents the CloudEvent data payload

            // Signal function completion
            return Task.CompletedTask;
        }
    }
}

Pada runtime .NET, Anda menggunakan classFramework Functions untuk .NET untuk menerapkan class pengendali CloudEvent dengan antarmuka ICloudEventFunction<T>. Metode HandleAsync() menerima objek CloudEvent dan payload data CloudEvent terkait sebagai argumen.

Jenis argumen payload data CloudEvent, yang ditunjukkan dalam contoh di atas sebagai CloudEventDataType, harus sesuai dengan jenis peristiwa yang ditangani fungsi. Library .NET Google CloudEvents menyediakan jenis data untuk berbagai peristiwa yang didukung oleh Google.

Titik entri fungsi adalah nama yang sepenuhnya memenuhi syarat untuk class pengendali CloudEvent, termasuk namespace. Dalam contoh ini, titik masuknya adalah MyProject.MyCloudEventFunction.

Ruby

require "functions_framework"

# Register a CloudEvent function with the Functions Framework
FunctionsFramework.cloud_event "my_cloudevent_function" do |cloud_event|
  # Your code here
  # Access the CloudEvent data payload via cloud_event.data
end

Dalam Ruby, Anda mendaftarkan fungsi pengendali CloudEvent dengan Functions Framework untuk Ruby. Fungsi pengendali Anda harus menerima objek Event CloudEvent sebagai argumen.

Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework. Dalam contoh ini, titik masuknya adalah my_cloudevent_function.

PHP

<?php

use CloudEvents\V1\CloudEventInterface;
use Google\CloudFunctions\FunctionsFramework;

// Register a CloudEvent function with the Functions Framework
FunctionsFramework::cloudEvent('myCloudEventFunction', 'myCloudEventHandler');

// Define your CloudEvent handler
function myCloudEventHandler(CloudEventInterface $event): void
{
    // Your code here
    // Access the CloudEvent data payload via $event->getData()
}

Di PHP, Anda mendaftarkan fungsi pengendali CloudEvent dengan Functions Framework untuk PHP. Fungsi pengendali Anda harus menerima argumen yang sesuai dengan antarmuka CloudEventInterface.

Titik entri fungsi adalah nama yang digunakan pengendali untuk mendaftar pada Functions Framework. Dalam contoh ini, titik masuknya adalah myCloudEventFunction.

Untuk fungsi CloudEvent, data peristiwa diteruskan ke fungsi Anda dalam format CloudEvent, dengan payload data CloudEvent yang sesuai dengan jenis peristiwa yang memicu fungsi Anda. Baca artikel Pemicu Cloud Functions untuk mengetahui informasi tentang pemicu yang didukung, jenis peristiwa, dan format data peristiwa terkait.

Repositori Google Events berisi resource untuk bekerja dengan CloudEvents yang dikeluarkan oleh Google.

Fungsi latar belakang

Fungsi berbasis peristiwa di runtime Cloud Functions (generasi ke-1), Node.js, Python, Go, dan Java mengharapkan argumen yang berbeda dari fungsi CloudEvent. Gaya lama fungsi berbasis peristiwa ini disebut fungsi latar belakang.

Contoh berikut menunjukkan file sumber fungsi latar belakang dasar untuk setiap runtime. Lihat Struktur direktori sumber untuk mengetahui informasi tentang lokasi kode sumber.

Node.js

// Define and export an event handler
exports.myBackgroundFunction = (eventData, context, callback) => {
  // Your code here
  // The eventData argument represents the event data payload

  // Optionally signal function completion:
  callback();
};

Di Node.js, Anda menentukan dan mengekspor fungsi yang menangani data peristiwa. Cloud Functions meneruskan fungsi pengendali argumen berikut:

  • eventData: Objek yang mewakili payload data peristiwa. Formatnya bergantung pada jenis acara.
  • context: Objek yang berisi metadata tentang peristiwa.
  • callback: Fungsi opsional yang dapat Anda panggil untuk menyelesaikan sinyal. Argumen pertama untuk callback ini ditafsirkan sebagai menandakan error. Jangan teruskan argumen atau argumen pertama null untuk menandakan keberhasilan.

Titik entri fungsi adalah nama pengendali peristiwa yang diekspor. Dalam contoh ini, titik masuknya adalah myBackgroundFunction.

Python

# Define an event handler
def my_background_function(event_data, context):
  # Your code here
  # The event_data argument represents the event data payload

Di Python, Anda menentukan fungsi yang menangani data peristiwa. Cloud Functions meneruskan fungsi pengendali argumen berikut:

  • event_data: Kamus yang mewakili payload data peristiwa. Formatnya bergantung pada jenis acara.
  • context: Objek yang berisi metadata tentang peristiwa.

Titik entri fungsi adalah nama fungsi pengendali. Dalam contoh ini, titik masuknya adalah my_background_function.

Go

package mybackgroundfunction

import (
    "context"
)

// Function MyBackgroundFunction accepts and handles event data
func MyBackgroundFunction(ctx context.Context, e EventDataType) error {
    // Your code here
    // The argument e represents the event data payload

    // Return nil if no error occurred
    return nil
}

Di Go, Anda menentukan fungsi yang diekspor yang menangani data peristiwa. Cloud Functions meneruskan fungsi pengendali argumen berikut:

  • ctx: Objek context.Context yang berisi metadata tentang peristiwa. Anda dapat mengambil metadata menggunakan paket cloud.google.com/go/functions/metadata.
  • e: Objek yang mewakili payload data peristiwa. Jenisnya, yang ditunjukkan dalam contoh di atas sebagai EventDataType, harus berupa struct yang sesuai dengan jenis peristiwa yang ditangani fungsi. Payload data peristiwa tidak disusun ke dalam struct menggunakan json.Unmarshal().

Titik entri fungsi adalah nama pengendali peristiwa yang diekspor. Dalam contoh ini, titik masuknya adalah MyBackgroundFunction.

Java

package mybackgroundfunction;

import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;

// Define a class that implements the BackgroundFunction<T> interface
public class MyBackgroundFunction implements BackgroundFunction<EventDataType> {
  // Implement the accept() method to handle events
  @Override
  public void accept(EventDataType eventData, Context context) {
    // Your code here
    // The eventData argument represents the event data payload
  }
}

Di Java, Anda menggunakan Functions Framework Java API untuk mengimplementasikan class pengendali peristiwa dengan antarmuka BackgroundFunction<T>. Metode accept() menerima payload data peristiwa sebagai argumen dan objek Context yang berisi metadata tentang peristiwa tersebut.

Jenis argumen payload data peristiwa, yang ditunjukkan dalam contoh di atas sebagai EventDataType, harus sesuai dengan jenis peristiwa yang ditangani fungsi. Payload data peristiwa dideserialisasi ke instance class ini menggunakan Gson.fromJson().

Titik entri fungsi adalah nama yang sepenuhnya memenuhi syarat dari class pengendali peristiwa, termasuk nama paket. Dalam contoh ini, titik masuknya adalah mybackgroundfunction.MyBackgroundFunction.

Untuk fungsi latar belakang, payload data peristiwa diteruskan langsung ke fungsi Anda dalam format yang sesuai dengan jenis peristiwa yang memicu fungsi Anda. Lihat Pemicu yang didukung di Cloud Functions (generasi ke-1) untuk mengetahui informasi tentang pemicu yang didukung, jenis peristiwa, dan format data peristiwa terkait.

Penghentian fungsi

Cloud Functions menganggap eksekusi fungsi berbasis peristiwa selesai saat fungsi tersebut dikembalikan. Jika fungsi membuat tugas latar belakang (seperti dengan thread, future, objek Promise JavaScript, callback, atau proses sistem), Anda harus menghentikan atau menyelesaikan tugas ini sebelum kembali dari fungsi. Setiap tugas yang tidak dihentikan sebelum fungsi ditampilkan mungkin belum diselesaikan, dan dapat menyebabkan perilaku yang tidak ditentukan.

Percobaan ulang otomatis

Fungsi berbasis peristiwa dapat dikonfigurasi untuk mencoba kembali pemanggilan yang gagal secara otomatis. Lihat Mencoba kembali fungsi berbasis peristiwa untuk mengetahui informasi selengkapnya.

Langkah berikutnya