Penanganan kesalahan dan percobaan kembali Azure Functions
Menangani kesalahan di Azure Functions penting untuk membantu Anda menghindari data yang hilang, menghindari peristiwa yang terlewat, dan memantau kesehatan aplikasi Anda. Ini juga merupakan cara penting untuk membantu Anda memahami perilaku percobaan kembali pemicu berbasis peristiwa.
Artikel ini menjelaskan strategi umum penanganan kesalahan dan strategi coba lagi yang tersedia.
Penting
Pratinjau dukungan kebijakan coba lagi untuk pemicu tertentu dihapus pada Desember 2022. Kebijakan percobaan kembali untuk pemicu yang didukung sekarang tersedia secara umum (GA). Untuk daftar ekstensi yang saat ini mendukung kebijakan coba lagi, lihat bagian Coba Lagi.
Menangani kesalahan
Kesalahan yang terjadi dalam fungsi Azure dapat berasal dari:
- Penggunaan pemicu dan pengikatan Fungsi bawaan.
- Panggilan ke API layanan Azure yang mendasarinya.
- Panggilan ke titik akhir REST.
- Panggilan ke pustaka klien, paket, atau API pihak ketiga.
Untuk menghindari hilangnya data atau pesan yang terlewat, penting untuk mempraktikkan penanganan kesalahan yang baik. Tabel ini menjelaskan beberapa praktik penanganan kesalahan yang direkomendasikan dan menyediakan tautan ke informasi selengkapnya.
Rekomendasi | Detail |
---|---|
Mengaktifkan Application Insights | Azure Functions terintegrasi dengan Application Insights untuk mengumpulkan data kesalahan, data performa, dan log runtime. Anda harus menggunakan Application Insights untuk menemukan dan lebih memahami kesalahan yang terjadi dalam eksekusi fungsi Anda. Untuk mempelajari selengkapnya, lihat Memantau Azure Functions. |
Gunakan penanganan kesalahan terstruktur | Menangkap dan mencatat kesalahan sangat penting untuk memantau kesehatan aplikasi Anda. Tingkat paling atas dari kode fungsi apa pun harus menyertakan blok coba/tangkap. Di blok tangkap, Anda dapat menangkap dan mencatat kesalahan. Untuk informasi tentang kesalahan apa yang mungkin dimunculkan oleh pengikatan, lihat Mengikat kode kesalahan. Bergantung pada strategi coba lagi spesifik, Anda mungkin juga menaikkan pengecualian baru untuk menjalankan fungsi lagi. |
Rencanakan strategi coba lagi Anda | Beberapa ekstensi pengikatan Functions menyediakan dukungan bawaan untuk percobaan ulang dan yang lain memungkinkan Anda menentukan kebijakan coba lagi, yang diterapkan oleh runtime Functions. Untuk pemicu yang tidak memberikan perilaku coba lagi, Anda harus mempertimbangkan untuk menerapkan skema coba lagi Anda sendiri. Untuk informasi selengkapnya, lihat Coba lagi. |
Desain untuk idempotensi | Terjadinya kesalahan saat Anda memproses data dapat menjadi masalah bagi fungsi Anda, terutama saat Anda memproses pesan. Penting untuk mempertimbangkan apa yang terjadi ketika kesalahan terjadi dan cara menghindari pemrosesan duplikat. Untuk informasi selengkapnya, lihat Merancang Azure Functions untuk input yang identik. |
Percobaan kembali
Ada dua jenis percobaan ulang yang tersedia untuk fungsi Anda:
- Perilaku coba lagi bawaan dari ekstensi pemicu individu
- Kebijakan coba lagi yang disediakan oleh runtime Functions
Tabel berikut menunjukkan pemicu mana yang mendukung percobaan ulang dan di mana perilaku coba lagi dikonfigurasi. Ini juga menautkan ke informasi lebih lanjut tentang kesalahan yang berasal dari layanan yang mendasar.
Pemicu/pengikatan | Coba lagi suatu sumber | Konfigurasi |
---|---|---|
Azure Cosmos DB | Kebijakan coba lagi | Tingkat fungsi |
Penyimpanan Blob | Ekstensi pengikatan | host.json |
Event Grid | Ekstensi pengikatan | Langganan peristiwa |
Event Hubs | Kebijakan coba lagi | Tingkat fungsi |
Kafka | Kebijakan coba lagi | Tingkat fungsi |
Queue Storage | Ekstensi pengikatan | host.json |
RabbitMQ | Ekstensi pengikatan | Antrean surat gagal |
Service Bus | Ekstensi pengikatan | host.json* |
Pengatur Waktu | Kebijakan coba lagi | Tingkat fungsi |
*Memerlukan ekstensi Azure Bus Layanan versi 5.x. Dalam versi ekstensi yang lebih lama, perilaku coba lagi diimplementasikan oleh antrean surat mati Bus Layanan.
Kebijakan percobaan kembali
Azure Functions memungkinkan Anda menentukan kebijakan coba lagi untuk jenis pemicu tertentu, yang diberlakukan oleh runtime. Jenis pemicu ini saat ini mendukung kebijakan coba lagi:
Dukungan coba lagi sama untuk model pemrograman Python v1 dan v2.
Kebijakan coba lagi tidak didukung dalam runtime Functions versi 1.x.
Kebijakan percobaan kembali memberi tahu runtime untuk menjalankan ulang eksekusi yang gagal hingga penyelesaian berhasil terjadi atau jumlah maksimum percobaan kembali tercapai.
Kebijakan coba lagi dievaluasi ketika fungsi yang dijalankan oleh jenis pemicu yang didukung menimbulkan pengecualian yang tidak tertangkap. Sebagai praktik terbaik, Anda harus menangkap semua pengecualian dalam kode Anda dan mengajukan pengecualian baru untuk kesalahan apa pun yang ingin Anda hasilkan coba lagi.
Penting
Titik pemeriksaan Azure Event Hubs tidak ditulis sampai setelah kebijakan coba lagi untuk eksekusi selesai. Karena perilaku ini, kemajuan pada partisi tertentu dijeda hingga batch saat ini selesai diproses.
Ekstensi Azure Event Hubs versi 5.x mendukung kemampuan coba lagi tambahan untuk interaksi antara host Functions dan hub peristiwa. Untuk informasi selengkapnya, lihat clientRetryOptions
di referensi azure Event Hubs host.json.
Strategi percobaan kembali
Anda dapat mengonfigurasi dua strategi coba lagi yang didukung oleh kebijakan:
Beberapa waktu tertentu dibiarkan berlalu di antara setiap percobaan kembali.
Saat berjalan dalam paket Konsumsi, Anda hanya ditagih untuk waktu kode fungsi Anda dijalankan. Anda tidak ditagih untuk waktu tunggu antara eksekusi dalam salah satu strategi coba lagi ini.
Jumlah maksimum percobaan kembali
Anda dapat mengonfigurasi berapa kali eksekusi fungsi dicoba kembali sebelum kegagalan akhirnya. Hitungan coba lagi saat ini disimpan dalam memori instans.
Dimungkinkan bagi instans untuk mengalami kegagalan antara upaya coba lagi. Ketika sebuah instans gagal selama kebijakan percobaan kembali, jumlah coba lagi hilang. Saat terjadi kegagalan instans, pemicu Pusat Aktivitas dapat melanjutkan pemrosesan dan mencoba kembali batch pada instans baru, dengan jumlah coba lagi yang diatur ulang ke nol. Pemicu timer tidak dilanjutkan pada instans baru.
Perilaku ini berarti bahwa jumlah percobaan kembali maksimum adalah upaya terbaik. Dalam beberapa kasus yang jarang terjadi, eksekusi dapat dicoba kembali lebih dari jumlah maksimum yang diminta. Untuk pemicu Timer, percobaan ulang dapat kurang dari jumlah maksimum yang diminta.
Contoh percobaan kembali
Contoh disediakan untuk strategi penundaan tetap dan backoff eksponensial. Untuk melihat contoh strategi tertentu, Anda harus terlebih dahulu memilih strategi tersebut di tab sebelumnya.
Percobaan ulang tingkat fungsi didukung dengan paket NuGet berikut:
- Microsoft.Azure.Functions.Worker.Sdk>= 1.9.0
- Microsoft.Azure.Functions.Worker.Extensions.EventHubs>= 5.2.0
- Microsoft.Azure.Functions.Worker.Extensions.Kafka>= 3.8.0
- Microsoft.Azure.Functions.Worker.Extensions.Timer>= 4.2.0
[Function(nameof(TimerFunction))]
[FixedDelayRetry(5, "00:00:10")]
public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo,
FunctionContext context)
{
var logger = context.GetLogger(nameof(TimerFunction));
logger.LogInformation($"Function Ran. Next timer schedule = {timerInfo.ScheduleStatus.Next}");
}
Properti | Deskripsi |
---|---|
MaxRetryCount | Harus diisi. Jumlah maksimum percobaan kembali yang diizinkan per eksekusi fungsi. -1 berarti mencoba lagi tanpa batas. |
DelayInterval | Penundaan yang digunakan di antara percobaan ulang. Tentukan sebagai string dengan format HH:mm:ss . |
Berikut adalah contoh kebijakan coba lagi yang ditentukan dalam file function.json :
{
"disabled": false,
"bindings": [
{
....
}
],
"retry": {
"strategy": "fixedDelay",
"maxRetryCount": 4,
"delayInterval": "00:00:10"
}
}
Anda dapat mengatur properti ini pada definisi kebijakan coba lagi:
Properti | Deskripsi |
---|---|
strategi | Harus diisi. Strategi coba lagi yang akan digunakan. Nilai yang valid adalah fixedDelay atau exponentialBackoff . |
maxRetryCount | Harus diisi. Jumlah maksimum percobaan kembali yang diizinkan per eksekusi fungsi. -1 berarti mencoba lagi tanpa batas. |
delayInterval | Penundaan yang digunakan di antara percobaan ulang saat Anda menggunakan fixedDelay strategi. Tentukan sebagai string dengan format HH:mm:ss . |
minimumInterval | Penundaan percobaan kembali minimum saat Anda menggunakan exponentialBackoff strategi. Tentukan sebagai string dengan format HH:mm:ss . |
maximumInterval | Penundaan percobaan kembali maksimum saat Anda menggunakan exponentialBackoff strategi. Tentukan sebagai string dengan format HH:mm:ss . |
Cara Anda menentukan kebijakan coba lagi untuk pemicu tergantung pada versi Node.js Anda.
Berikut adalah contoh fungsi pemicu Timer yang menggunakan strategi coba lagi penundaan tetap:
const { app } = require('@azure/functions');
app.timer('timerTriggerWithRetry', {
schedule: '0 */5 * * * *',
retry: {
strategy: 'fixedDelay',
delayInterval: {
seconds: 10,
},
maxRetryCount: 4,
},
handler: (myTimer, context) => {
if (context.retryContext?.retryCount < 2) {
throw new Error('Retry!');
} else {
context.log('Timer function processed request.');
}
},
});
Cara Anda menentukan kebijakan coba lagi untuk pemicu tergantung pada versi Node.js Anda.
Berikut adalah contoh fungsi pemicu Timer yang menggunakan strategi coba lagi penundaan tetap:
import { app, InvocationContext, Timer } from '@azure/functions';
export async function timerTriggerWithRetry(myTimer: Timer, context: InvocationContext): Promise<void> {
if (context.retryContext?.retryCount < 2) {
throw new Error('Retry!');
} else {
context.log('Timer function processed request.');
}
}
app.timer('timerTriggerWithRetry', {
schedule: '0 */5 * * * *',
retry: {
strategy: 'fixedDelay',
delayInterval: {
seconds: 10,
},
maxRetryCount: 4,
},
handler: timerTriggerWithRetry,
});
Anda dapat mengatur properti ini pada definisi kebijakan coba lagi:
Properti | Deskripsi |
---|---|
strategi | Harus diisi. Strategi coba lagi yang akan digunakan. Nilai yang valid adalah fixedDelay atau exponentialBackoff . |
maxRetryCount | Harus diisi. Jumlah maksimum percobaan kembali yang diizinkan per eksekusi fungsi. -1 berarti mencoba lagi tanpa batas. |
delayInterval | Penundaan yang digunakan di antara percobaan ulang saat Anda menggunakan fixedDelay strategi. Tentukan sebagai string dengan format HH:mm:ss . |
minimumInterval | Penundaan percobaan kembali minimum saat Anda menggunakan exponentialBackoff strategi. Tentukan sebagai string dengan format HH:mm:ss . |
maximumInterval | Penundaan percobaan kembali maksimum saat Anda menggunakan exponentialBackoff strategi. Tentukan sebagai string dengan format HH:mm:ss . |
Berikut adalah contoh fungsi pemicu Timer yang menggunakan strategi coba lagi penundaan tetap:
import logging
from azure.functions import AuthLevel, Context, FunctionApp, TimerRequest
app = FunctionApp(http_auth_level=AuthLevel.ANONYMOUS)
@app.timer_trigger(schedule="*/1 * * * * *", arg_name="mytimer",
run_on_startup=False,
use_monitor=False)
@app.retry(strategy="fixed_delay", max_retry_count="3",
delay_interval="00:00:01")
def mytimer(mytimer: TimerRequest, context: Context) -> None:
logging.info(f'Current retry count: {context.retry_context.retry_count}')
if context.retry_context.retry_count == \
context.retry_context.max_retry_count:
logging.info(
f"Max retries of {context.retry_context.max_retry_count} for "
f"function {context.function_name} has been reached")
else:
raise Exception("This is a retryable exception")
Anda dapat mengatur properti ini pada definisi kebijakan coba lagi:
Properti | Deskripsi |
---|---|
strategi | Harus diisi. Strategi coba lagi yang akan digunakan. Nilai yang valid adalah fixed_delay atau exponential_backoff . |
max_retry_count | Harus diisi. Jumlah maksimum percobaan kembali yang diizinkan per eksekusi fungsi. -1 berarti mencoba lagi tanpa batas. |
delay_interval | Penundaan yang digunakan di antara percobaan ulang saat Anda menggunakan fixed_delay strategi. Tentukan sebagai string dengan format HH:mm:ss . |
minimum_interval | Penundaan percobaan kembali minimum saat Anda menggunakan exponential_backoff strategi. Tentukan sebagai string dengan format HH:mm:ss . |
maximum_interval | Penundaan percobaan kembali maksimum saat Anda menggunakan exponential_backoff strategi. Tentukan sebagai string dengan format HH:mm:ss . |
@FunctionName("TimerTriggerJava1")
@FixedDelayRetry(maxRetryCount = 4, delayInterval = "00:00:10")
public void run(
@TimerTrigger(name = "timerInfo", schedule = "0 */5 * * * *") String timerInfo,
final ExecutionContext context
) {
context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now());
}
Kode kesalahan pengikatan
Saat Anda mengintegrasikan dengan layanan Azure, kesalahan mungkin berasal dari API layanan yang mendasar. Informasi yang berkaitan dengan kesalahan khusus pengikatan tersedia di bagian "Pengecualian dan kode pengembalian" dari artikel berikut:
- Azure Cosmos DB
- Penyimpanan Blob
- Event Grid
- Event Hubs
- Pusat IoT
- Notification Hubs
- Queue Storage
- Service Bus
- Penyimpanan Tabel