Anti-pola: Menggunakan WaitForComplete() dalam kode JavaScript

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Kebijakan JavaScript di Apigee Edge memungkinkan Anda menambahkan kode kustom yang dijalankan dalam konteks alur proxy API. Misalnya, kode kustom dalam kebijakan JavaScript dapat digunakan untuk:

  • Mendapatkan dan menetapkan variabel alur
  • Menjalankan logika kustom dan melakukan penanganan kesalahan
  • Mengekstrak data dari permintaan atau respons
  • Mengedit URL target backend secara dinamis
  • Menambahkan atau menghapus header dari permintaan atau respons secara dinamis
  • Mengurai respons JSON

Klien HTTP

Fitur canggih kebijakan JavaScript adalah klien HTTP. Klien HTTP (atau objek httpClient) dapat digunakan untuk melakukan satu atau beberapa panggilan ke layanan backend atau eksternal. Klien HTTP sangat berguna jika ada kebutuhan untuk melakukan panggilan ke beberapa layanan eksternal dan menggabungkan respons dalam satu API.

Contoh Kode JavaScript yang melakukan panggilan ke backend dengan objek httpClient

var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);

Objek httpClient mengekspos dua metode get dan send (send digunakan dalam kode contoh di atas) untuk membuat permintaan HTTP. Kedua metode ini asinkron dan menampilkan objek exchange sebelum permintaan HTTP yang sebenarnya diselesaikan.

Permintaan HTTP mungkin perlu waktu beberapa detik hingga beberapa menit. Setelah permintaan HTTP dibuat, penting untuk mengetahui kapan permintaan tersebut selesai, sehingga respons dari permintaan tersebut dapat diproses. Salah satu cara paling umum untuk menentukan kapan permintaan HTTP selesai adalah dengan memanggil metode waitForComplete() objek exchange.

waitForComplete()

Metode waitForComplete() menjeda thread hingga permintaan HTTP selesai dan respons (berhasil/gagal) ditampilkan. Kemudian, respons dari backend atau layanan eksternal dapat diproses.

Contoh kode JavaScript dengan waitForComplete()

var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
// Wait for the asynchronous GET request to finish
exchange.waitForComplete();

// Get and Process the response
if (exchange.isSuccess()) {
    var responseObj = exchange.getResponse().content.asJSON;
    return responseObj.access_token;
} else if (exchange.isError()) {
    throw new Error(exchange.getError());
}

Anti-pola

Menggunakan waitForComplete() setelah mengirim permintaan HTTP dalam kode JavaScript akan memiliki implikasi performa.

Pertimbangkan kode JavaScript berikut yang memanggil waitForComplete() setelah mengirim permintaan HTTP.

Kode untuk sample.js

// Send the HTTP request
var exchangeObj = httpClient.get("http://example.com");
// Wait until the request is completed
exchangeObj.waitForComplete();
// Check if the request was successful
if (exchangeObj.isSuccess())  {

    response = exchangeObj.getResponse();
    context.setVariable('example.status', response1.status);
} else {
   error = exchangeObj.getError();
   context.setVariable('example.error', 'Woops: ' + error);
}

Dalam contoh ini:

  1. Kode JavaScript mengirim permintaan HTTP ke API backend.
  2. Kemudian, kode ini memanggil waitForComplete() untuk menjeda eksekusi hingga permintaan selesai.

    waitForComplete() API menyebabkan thread yang mengeksekusi kode JavaScript diblokir hingga backend selesai memproses permintaan dan merespons kembali.

Ada batas atas jumlah thread (30%) yang dapat mengeksekusi kode JavaScript secara serentak di Pemroses Pesan kapan saja. Setelah batas ini tercapai, tidak akan ada thread yang tersedia untuk mengeksekusi kode JavaScript. Jadi, jika ada terlalu banyak permintaan serentak yang mengeksekusi waitForComplete() API dalam kode JavaScript, permintaan berikutnya akan gagal dengan 500 Internal Server Error dan 'Timed out' pesan error bahkan sebelum kebijakan JavaScript habis waktunya.

Secara umum, skenario ini dapat terjadi jika backend memerlukan waktu lama untuk memproses permintaan atau ada traffic yang tinggi.

Dampak

  1. Permintaan API akan gagal dengan 500 Internal Server Error dan pesan error 'Timed out' jika jumlah permintaan serentak yang mengeksekusi waitForComplete() dalam kode JavaScript melebihi batas yang telah ditentukan.
  2. Mendiagnosis penyebab masalah bisa menjadi rumit karena JavaScript gagal dengan 'Timed out' meskipun batas waktu untuk kebijakan JavaScript tertentu belum berlalu.

Praktik Terbaik

Gunakan callback di klien HTTP untuk menyederhanakan kode info dan meningkatkan performa, serta menghindari penggunaan waitForComplete() dalam kode JavaScript. Metode ini memastikan bahwa thread yang menjalankan JavaScript tidak diblokir hingga permintaan HTTP selesai.

Saat callback digunakan, thread akan mengirimkan permintaan HTTP dalam kode JavaScript dan kembali ke kumpulan tersebut. Karena tidak lagi diblokir, thread tersedia untuk menangani permintaan lain. Setelah permintaan HTTP selesai dan callback siap dijalankan, tugas akan dibuat dan ditambahkan ke task queue. Salah satu thread dari kumpulan akan mengeksekusi callback berdasarkan prioritas tugas.

Contoh kode JavaScript menggunakan Callback di httpClient

function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}
// Specify the callback Function as an argument
httpClient.get("http://example.com", onComplete);

Bacaan lebih lanjut