Function Compute menangani eksekusi kode melalui serangkaian konsep inti waktu proses: handler, kait siklus hidup, pencatatan log, dan penanganan error. Halaman ini menjelaskan cara kerja masing-masing agar Anda dapat menulis dan men-debug fungsi secara efektif.
Handlers
Setiap fungsi memerlukan handler—titik masuk yang dimuat dan dipanggil oleh waktu proses Function Compute untuk memproses permintaan. Tetapkan handler menggunakan parameter Handler di Konsol Function Compute. Untuk detail pengaturan, lihat Buat fungsi.
Function Compute mendukung dua jenis handler:
Event handler: memproses permintaan dari sumber event seperti Object Storage Service (OSS), Simple Log Service, dan ApsaraMQ for RocketMQ—apa pun kecuali pemicu HTTP.
HTTP handler: memproses permintaan HTTP secara langsung. Lihat Konfigurasi dan gunakan pemicu HTTP untuk detailnya.
Praktik terbaik untuk handler
Simpan kode inisialisasi di luar badan fungsi handler. Klien SDK, koneksi database, dan dependensi yang dimuat saat startup instans akan digunakan ulang di berbagai pemanggilan—mengurangi latensi dan biaya per pemanggilan. Kait Initializer (dijelaskan di bawah) merupakan tempat yang direkomendasikan untuk pekerjaan ini.
Jangan menyimpan data pengguna atau status sensitif keamanan dalam variabel global. Function Compute dapat menggunakan ulang satu instans untuk beberapa pemanggilan, dan status global tetap ada antar pemanggilan.
Kait siklus hidup untuk instans fungsi
Dalam mode permintaan, Function Compute secara otomatis membuat instans saat permintaan tiba. Saat tidak aktif, instans dibekukan dan akhirnya dihapus setelah periode ketidakaktifan tertentu.
Siklus hidup instans mengikuti urutan berikut:
Dibuat → Diinisialisasi (Initializer) → Berjalan → PreFreeze → Dibekukan → PreStop → DihapusKait siklus hidup memungkinkan Anda menjalankan kode pada transisi penting dalam siklus ini. Function Compute menyediakan tiga kait: Initializer, PreFreeze, dan PreStop. Untuk model siklus hidup lengkap, lihat Siklus hidup instans fungsi.
Kait Initializer
Kait Initializer dijalankan setelah inisialisasi instans, sebelum handler memproses permintaan apa pun. Kait ini dijalankan tepat satu kali selama masa pakai instans.
Jika kait gagal, instans saat ini akan dihapus dan instans baru dibuat untuk mencoba ulang.
Gunakan kait Initializer untuk pekerjaan persiapan yang mahal jika diulang pada setiap pemanggilan: membuat kolam koneksi, memuat dependensi, atau menjalankan tugas inisialisasi database. Memindahkan pekerjaan ini ke tahap inisialisasi mengurangi latensi per pemanggilan.
Kait PreFreeze
Kait PreFreeze dijalankan tepat sebelum instans dibekukan. Gunakan kait ini untuk menyelesaikan operasi yang sedang berjalan sebelum instans menjadi tidak aktif—misalnya, memastikan metrik telah dikirim sebelum pembekuan.
Kait PreStop
Kait PreStop dijalankan tepat sebelum instans dihapus. Gunakan kait ini untuk membersihkan secara elegan—misalnya, menutup koneksi database atau melaporkan status akhir sebelum instans keluar.
Manajemen log
Anda harus mengonfigurasi Logstore tingkat layanan sebelum log fungsi dapat disimpan. Lihat Konfigurasi pencatatan log untuk instruksi pengaturan. Jika Anda mengaktifkan pencatatan log saat membuat layanan di Konsol Function Compute, Logstore akan diatur secara otomatis.
Function Compute terintegrasi dengan Simple Log Service untuk menyimpan log pemanggilan maupun log yang dicetak dari kode fungsi Anda.
Baik pernyataan cetak bawaan bahasa pemrograman maupun pernyataan pencatatan log yang disediakan FC menulis ke Logstore. Perbedaannya adalah bahwa pernyataan pencatatan log FC memberi tag setiap entri dengan ID permintaan, sehingga mempermudah penyaringan dan korelasi log antar pemanggilan.
| Bahasa pemrograman | Pernyataan bawaan | Pernyataan pencatatan log FC | Referensi |
|---|---|---|---|
| Node.js | console.log() | context.logger.info() | Cetak log |
| Python | print() | logging.getLogger().info() | Cetak log |
| Java | System.out.println() | context.getLogger().info() | Cetak log |
| PHP | echo "" . PHP_EOL | $GLOBALS['fcLogger']->info() | Pencetakan log |
| C# | Console.WriteLine("") | context.Logger.LogInformation() | Penanganan error |
Format output berbeda antara kedua pendekatan tersebut. Pernyataan print() biasa menghasilkan pesan mentah; pernyataan pencatatan log FC mencakup timestamp, ID permintaan, dan tingkat log:
# Pernyataan cetak bawaan
# print('hello world')
message: hello world
# Pernyataan pencatatan log FC
# logger.info('hello world')
message: 2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello worldGunakan pernyataan pencatatan log FC ketika Anda perlu mengorelasikan output log antar beberapa pemanggilan atau menyaring log berdasarkan ID permintaan.
Struktur log
Setiap entri log eksekusi fungsi berisi nama layanan, nama fungsi, versi, alias, dan konten pesan. Struktur lengkapnya tampak seperti berikut:
__source__:
__tag__:__receive_time__: 1584072413
__topic__: myService
functionName: myFunction
message: 2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
qualifier: LATEST
serviceName: myService
versionId:Deskripsi field:
| Field | Deskripsi |
|---|---|
__source__ | Asal entri log |
__tag__:__receive_time__ | Timestamp Unix saat log diterima oleh Simple Log Service |
__topic__ | Memetakan ke nama layanan |
functionName | Fungsi yang menghasilkan log |
serviceName | Layanan tempat fungsi tersebut berada |
qualifier | Alias versi yang digunakan untuk pemanggilan ini (misalnya, LATEST) |
versionId | ID versi numerik, jika berlaku |
message | Konten log, termasuk timestamp, ID permintaan, tingkat log, dan teks |
Selain log kode, Function Compute secara otomatis menulis dua baris log sistem per pemanggilan:
FC Invoke Start RequestId: <id>— dicetak saat eksekusi dimulaiFC Invoke End RequestId: <id>— dicetak saat eksekusi selesai
Gunakan penanda batas ini untuk mengidentifikasi semua output log untuk satu permintaan: saring berdasarkan ID permintaan untuk melihat setiap baris yang dicatat selama pemanggilan tersebut.
Penanganan error
Function Compute mengklasifikasikan error pemanggilan menjadi dua jenis.
HandledInvocationError
Jenis ini hanya berlaku untuk error yang secara eksplisit dikembalikan melalui parameter callback di Node.js. Informasi error tersebut disertakan dalam badan respons.
'use strict';
module.exports.handler = function(event, context, callback) {
console.log('hello world');
callback('this is error', 'hello world');
};Contoh respons error:
{"errorMessage":"this is error"}UnhandledInvocationError
Semua error lainnya—exception waktu proses, timeout, error kehabisan memori—diklasifikasikan sebagai UnhandledInvocationError. stackTrace untuk error ini dicetak dalam log fungsi. Gunakan ID permintaan untuk menemukan entri log yang relevan dan menemukan stack trace tersebut.
Untuk mendiagnosis UnhandledInvocationError:
Temukan baris
FC Invoke Start RequestIddi log Anda untuk pemanggilan yang gagal.Saring semua entri log berdasarkan ID permintaan tersebut.
Temukan output
stackTraceuntuk mengidentifikasi akar penyebabnya.
Lingkungan sistem operasi
Function Compute berjalan di Debian 9 LTS. Hanya arsitektur x86_64 yang didukung.
Sesuaikan lingkungan menggunakan layer atau variabel lingkungan. Misalnya, instans fungsi berjalan dalam UTC secara default. Untuk beralih ke UTC+8, atur variabel lingkungan TZ ke Asia/Shanghai.
Untuk informasi lebih lanjut, lihat Kelola layer. Untuk variabel yang tersedia dan dampaknya, lihat Variabel lingkungan.