Antipola: Respons error cache

Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Lihat dokumentasi Apigee Edge.

Caching adalah proses penyimpanan data sementara di area penyimpanan yang disebut cache untuk referensi mendatang. Menyimpan data dalam cache memberikan manfaat performa yang signifikan karena:

  • Memungkinkan pengambilan data dengan lebih cepat
  • Mengurangi waktu pemrosesan dengan menghindari pembuatan ulang data berulang kali
  • Mencegah permintaan API mengenai server backend sehingga mengurangi overhead pada server backend
  • Memungkinkan pemanfaatan resource sistem/aplikasi 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 memungkinkan penyimpanan data di cache saat runtime untuk persistensi dan pengambilan yang lebih cepat. Fitur caching tersedia melalui kebijakan FillCache, kebijakan LookupCache, kebijakan InvalidateCache, dan kebijakanResponseCache.

Di bagian ini, mari kita lihat kebijakan Cache Respons. Kebijakan Cache Respons di platform Apigee 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, sehingga menghindari penerusan permintaan ke server backend jika tidak diperlukan.

Kebijakan Cache Respons:

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

Antipola

KebijakanResponseCache memungkinkan Anda meng-cache respons HTTP dengan kode Status apa pun yang memungkinkan, secara default. Ini berarti bahwa respons yang berhasil dan error bisa di-cache.

Berikut ini 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 konfigurasi defaultnya. Namun, sebaiknya jangan simpan respons error di cache tanpa mempertimbangkan dampak negatifnya karena:

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

    ATAU

  • Skenario 2: Kegagalan akan diamati selama jangka waktu yang tetap. Selanjutnya, kita harus memodifikasi kode untuk menghindari penyimpanan respons dalam cache setelah masalah diperbaiki

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

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 waktu
  • Resource backend yang diminta mungkin dihapus/tidak tersedia untuk sementara waktu
  • Server backend merespons dengan 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 berlarut-larut atau diperbaiki

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

  • Resource backend tertentu tidak akan tersedia selama 1 jam

    ATAU

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

Dengan informasi ini, kita dapat menetapkan 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, kami harus mengubah kebijakan untuk menghindari penyimpanan respons error dalam cache. Hal ini karena jika ada kegagalan sementara/satu kali dari server backend, kita akan meng-cache respons dan akan mendapatkan masalah yang dijelaskan dalam skenario 1 di atas.

Dampak

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

Praktik terbaik

  • Jangan simpan respons error dalam cache respons. Pastikan elemen <ExcludeErrorResponse> ditetapkan ke true dalam kebijakan ResponsCache agar respons error tidak di-cache seperti yang ditampilkan dalam cuplikan kode di bawah. Dengan konfigurasi ini, hanya respons untuk kode keberhasilan default 200 hingga 205 (kecuali kode keberhasilan 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 diharuskan untuk menyimpan respons error di cache karena alasan tertentu, Anda dapat menentukan durasi waktu maksimum/persis bagi kegagalan tersebut (jika memungkinkan):
    • Tetapkan Expiration time dengan tepat untuk memastikan Anda tidak meng-cache respons error lebih lama daripada 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 singkat/sementara.

  • Apigee tidak merekomendasikan meng-cache respons 5xx dari server backend.