Antipola: Respons error cache

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

Caching adalah proses menyimpan data untuk sementara di area penyimpanan yang disebut cache untuk referensi mendatang. 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 mencapai server backend sehingga mengurangi overhead pada server backend
  • Memungkinkan pemanfaatan sumber daya aplikasi/sistem yang lebih baik
  • Meningkatkan waktu respons API

Setiap kali kami harus sering mengakses beberapa data yang tidak terlalu sering berubah, kami sangat menyarankan untuk menggunakan cache untuk menyimpan data ini.

Apigee Edge memungkinkan penyimpanan data dalam cache saat runtime untuk persistensi dan pengambilan yang lebih cepat. Fitur caching tersedia melalui kebijakan FillCache, kebijakan LookupCache, kebijakan InvalidateCache, dan kebijakan ResponseCache.

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

Kebijakan Cache Respons:

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

Antipola

Kebijakan ResponsCache memungkinkan Anda meng-cache respons HTTP dengan kode Status apa pun yang memungkinkan, secara default. Ini berarti respons berhasil dan error bisa 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 Response Cache menyimpan respons error dalam cache dalam konfigurasi defaultnya. Namun, sebaiknya jangan meng-cache respons error tanpa mempertimbangkan implikasi yang merugikan karena:

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

    ATAU

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

Mari kita jelaskan hal ini dengan mengambil dua skenario ini secara lebih detail.

Skenario 1: Kegagalan backend/resource sementara

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

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

Dalam semua kasus ini, kegagalan dapat terjadi selama jangka waktu yang tidak diketahui, lalu kita mungkin akan mulai mendapatkan respons yang berhasil. Jika respons error di-cache, kami dapat terus mengirim respons error kepada pengguna meskipun masalah pada server backend telah diperbaiki.

Skenario 2: Kegagalan backend/resource yang berkepanjangan atau diperbaiki

Anggap kita mengetahui bahwa kegagalan di backend berlangsung selama jangka waktu yang tetap. Misalnya, Anda mengetahui bahwa:

  • Resource backend tertentu tidak akan tersedia selama 1 jam

    ATAU

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

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

Dampak

  • Menyimpan respons error ke cache dapat menyebabkan pengiriman respons error bahkan setelah masalah diselesaikan di server backend
  • Pengguna mungkin menghabiskan banyak upaya untuk memecahkan penyebab masalah tanpa mengetahui bahwa masalah tersebut disebabkan oleh penyimpanan respons error dari server backend ke dalam cache

Praktik terbaik

  • Jangan simpan respons error di cache respons. Pastikan elemen <ExcludeErrorResponse> ditetapkan ke true dalam kebijakan ResponseCache untuk mencegah respons error di-cache seperti yang ditunjukkan dalam cuplikan kode di bawah. Dengan konfigurasi ini, hanya respons untuk kode sukses default 200 hingga 205 (kecuali kode berhasil diubah) yang akan disimpan dalam 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 memiliki persyaratan untuk menyimpan respons error ke dalam cache karena alasan tertentu, Anda dapat menentukan durasi maksimum/persis saat kegagalan akan diamati (jika memungkinkan):
    • Tetapkan Waktu habis masa berlaku dengan tepat untuk memastikan Anda tidak meng-cache respons error lebih lama dari waktu kegagalan dapat terlihat.
    • Gunakan kebijakan ResponseCache untuk meng-cache respons error tanpa elemen <ExcludeErrorResponse>.

    Lakukan hal ini hanya jika Anda benar-benar yakin bahwa kegagalan server backend bukan hanya untuk periode waktu yang singkat/sementara.

  • Apigee tidak merekomendasikan menyimpan respons 5xx dari server backend ke dalam cache.