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:

[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:

from azure.functions import FunctionApp, TimerRequest, Context, AuthLevel
import logging

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:

Langkah berikutnya