Antipola: Respons error cache

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

{i>Caching<i} adalah proses menyimpan data sementara di area penyimpanan yang disebut {i>cache for future <i} alamat IP internal. Menyimpan data ke dalam cache memberikan manfaat performa yang signifikan karena:

  • Memungkinkan pengambilan data yang lebih cepat
  • Mengurangi waktu pemrosesan dengan menghindari pembuatan ulang data berulang kali
  • Mencegah permintaan API mengenai server backend dan dengan demikian mengurangi overhead pada server backend
  • Memungkinkan pemanfaatan resource sistem/aplikasi yang lebih baik
  • Meningkatkan waktu respons API

Kapan pun kami harus sering mengakses beberapa data yang tidak terlalu sering berubah, kami akan sarankan untuk menggunakan {i> cache<i} untuk menyimpan data ini.

Apigee Edge memberikan kemampuan untuk menyimpan data dalam cache saat runtime untuk persistensi dan lebih cepat atau pengambilan. Fitur penyimpanan cache tersedia melalui kebijakan IsiCache, Kebijakan LookupCache, kebijakan InvalidateCache, dan kebijakanResponseCache.

Di bagian ini, mari kita lihat kebijakan Cache Respons. Kebijakan Cache Respons di Apigee Edge memungkinkan Anda meng-cache respons dari server backend. Jika aplikasi klien membuat permintaan ke resource backend yang sama berulang kali dan resource akan diperbarui secara berkala, maka kami dapat meng-cache respons tersebut menggunakan kebijakan ini. Kebijakan Cache Respons membantu mengembalikan respons yang di-cache dan akibatnya menghindari penerusan permintaan ke server backend jika tidak perlu.

Kebijakan Cache Respons:

  • Mengurangi jumlah permintaan yang mencapai backend
  • Mengurangi bandwidth jaringan
  • Meningkatkan performa API dan waktu respons

Anti-pola

KebijakanResponseCache memungkinkan Anda meng-cache respons HTTP dengan kemungkinan kode Status, secara {i>default<i}. Artinya, respons berhasil dan error dapat di-cache.

Berikut adalah contoh kebijakan Cache Respons dengan konfigurasi default:

<!-- /antipatterns/examples/1-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
  <DisplayName>TargetServer ResponseCache</DisplayName>
  <CacheKey>
    <Key Fragment ref="request.uri" /></CacheKey>
    <Scope>Exclusive</Scope>
    <ExpirySettings>
      <TimeoutInSec ref="flow.variable.here">600</TimeoutInSec>
    </ExpirySettings>
  <CacheResource>targetCache</CacheResource>
</ResponseCache>

Kebijakan Cache Respons menyimpan respons error dalam cache dalam setelan default-nya konfigurasi Anda. Namun, tidak disarankan untuk meng-cache respons error tanpa banyak pemikiran tentang implikasi buruknya karena:

  • Skenario 1: Kegagalan terjadi untuk periode sementara yang tidak diketahui, dan kami dapat terus mengirimkan respons error karena penyimpanan cache bahkan setelah masalah diperbaiki

    ATAU

  • Skenario 2: Kegagalan akan diamati selama jangka waktu tertentu, maka kita harus memodifikasi kode untuk menghindari cache respons setelah masalah diperbaiki

Mari kita jelaskan dengan membahas kedua skenario ini secara lebih rinci.

Skenario 1: Kegagalan backend/resource sementara

Pertimbangkan bahwa kegagalan di server backend disebabkan oleh salah satu alasan berikut:

  • Glitch jaringan sementara
  • Server backend sangat sibuk dan tidak dapat menanggapi permintaan untuk titik
  • Resource backend yang diminta mungkin dihapus/tidak tersedia untuk sementara waktu
  • Server backend merespons lambat karena waktu pemrosesan yang tinggi untuk sementara waktu, dll.

Dalam semua kasus ini, kegagalan dapat terjadi selama jangka waktu yang tidak diketahui, lalu kami dapat mulai mendapatkan respons yang sukses. Jika kami meng-cache respons error, maka kami dapat terus mengirimkan respons error kepada pengguna meskipun masalah dengan server backend telah diperbaiki.

Skenario 2: Kegagalan backend/resource yang berkepanjangan atau diperbaiki

Misalkan kita mengetahui kegagalan di backend terjadi selama jangka waktu yang tetap. Contohnya, Anda menyadari bahwa:

  • Resource backend tertentu tidak akan tersedia selama 1 jam

    ATAU

  • Server backend dihapus/tidak tersedia selama 24 jam karena kegagalan situs tiba-tiba, masalah penskalaan, pemeliharaan, upgrade, dll.

Dengan informasi ini, kita dapat menetapkan waktu habis masa berlaku cache dengan tepat di Cache Respons sehingga kami tidak meng-cache respons error untuk waktu yang lebih lama. Namun, setelah server/resource backend tersedia lagi, kita harus mengubah kebijakan untuk menghindari penyimpanan cache respons error yang ada. Hal ini karena jika terjadi kegagalan sementara/satu kali dari backend server, kita akan membuat {i>cache<i} respons dan akan berakhir dengan masalah yang dijelaskan dalam skenario 1 di atas.

Dampak

  • Menyimpan respons error dalam cache dapat menyebabkan respons error dikirim, bahkan setelah masalah di-resolve di server backend
  • Pengguna mungkin akan berusaha keras untuk memecahkan penyebab suatu masalah tanpa menyadari bahwa hal ini disebabkan oleh respons error yang disimpan dalam cache server backend

Praktik terbaik

  • Jangan simpan respons error di cache respons. Pastikan bahwa Elemen <ExcludeErrorResponse> disetel ke true di KebijakanResponseCache untuk mencegah respons error disimpan ke cache seperti yang ditunjukkan pada kode di bawah cuplikan kode. Dengan konfigurasi ini hanya memberikan respons untuk kode keberhasilan {i>default<i} 200 hingga 205 (kecuali kode berhasil diubah) akan di-cache.
    <!-- /antipatterns/examples/1-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
      <DisplayName>TargetServerResponseCache</DisplayName>
      <CacheKey>
        <KeyFragment ref="request.uri" />
      </CacheKey>
      <Scope>Exclusive</Scope>
      <ExpirySettings>
        <TimeoutinSec ref="flow.variable.here">600</TimeoutinSec>
      </ExpirySettings>
      <CacheResource>targetCache</CacheResource>
      <ExcludeErrorResponse>true</ExcludeErrorResponse>
    </ResponseCache>
  • Jika Anda diwajibkan untuk menyimpan respons error ke dalam cache karena alasan tertentu, dapat menentukan durasi waktu maksimum/persis kapan kegagalan akan diamati (jika mungkin):
    • Tetapkan Waktu habis masa berlaku dengan tepat untuk memastikan bahwa Anda tidak menyimpan respons error dalam cache lebih lama dari waktu kegagalan terlihat.
    • Gunakan kebijakan ResponseCache untuk meng-cache respons error tanpa Elemen <ExcludeErrorResponse>.

    Lakukan ini hanya jika Anda benar-benar yakin bahwa kegagalan server backend bukan karena periode singkat/sementara.

  • Apigee tidak merekomendasikan caching respons 5xx dari server backend.