Antipola: Menyimpan respons error dalam cache

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

Pembuatan cache adalah proses penyimpanan data untuk sementara di area penyimpanan yang disebut cache untuk referensi di masa 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 menabrak server backend sehingga mengurangi overhead di server backend
  • Memungkinkan pemanfaatan resource sistem/aplikasi yang lebih baik
  • Meningkatkan waktu respons API

Setiap kali kita harus sering mengakses beberapa data yang tidak terlalu sering berubah, sebaiknya gunakan cache untuk menyimpan data ini.

Apigee menyediakan kemampuan untuk menyimpan data dalam cache saat runtime untuk persistensi dan pengambilan yang lebih cepat. Fitur penyimpanan dalam cache tersedia melalui kebijakan PopulateCache, kebijakan LookupCache, kebijakan InvalidateCache, dan kebijakan ResponseCache.

Di bagian ini, mari kita lihat kebijakan Cache Respons. Kebijakan Cache Respons di platform Apigee memungkinkan Anda menyimpan respons dalam cache dari server backend. Jika aplikasi klien membuat permintaan ke resource backend yang sama berulang kali dan resource diperbarui secara berkala, kita dapat menyimpan respons ini ke cache 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 ResponseCache memungkinkan Anda meng-cache respons HTTP dengan kode Status yang mungkin ada, secara default. Ini berarti 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 meng-cache respons error dalam konfigurasi defaultnya. Namun, sebaiknya jangan menyimpan respons error dalam cache tanpa memikirkan implikasi negatifnya karena:

  • Skenario 1: Kegagalan terjadi untuk periode sementara yang tidak diketahui dan kami dapat terus mengirim respons error karena penyimpanan dalam cache meskipun masalah telah diperbaiki

    ATAU

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

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

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 periode sementara
  • Resource backend yang diminta mungkin dihapus/tidak tersedia untuk sementara
  • Server backend merespons dengan lambat karena waktu pemrosesan yang tinggi untuk jangka waktu sementara, dll.

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

Skenario 2: Kegagalan backend/resource yang berkepanjangan atau tetap

Pertimbangkan bahwa kita tahu kegagalan di backend terjadi selama jangka waktu tertentu. 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 mendadak, 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, kita harus mengubah kebijakan untuk menghindari cache respons error. Hal ini karena jika ada kegagalan sementara/satu kali dari server backend, kita akan meng-cache respons dan akan mengalami masalah yang dijelaskan dalam skenario 1 di atas.

Dampak

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

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 keberhasilan default 200 hingga 205 (kecuali jika kode keberhasilan diubah) yang 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 memiliki persyaratan untuk meng-cache respons error karena alasan tertentu, Anda dapat menentukan durasi waktu maksimum/tepatnya kegagalan akan diamati (jika memungkinkan):
    • Tetapkan Waktu habis masa berlaku dengan tepat untuk memastikan Anda tidak menyimpan respons error dalam cache lebih lama dari waktu yang dapat dilihat kegagalannya.
    • Gunakan kebijakan ResponseCache untuk meng-cache respons error tanpa elemen <ExcludeErrorResponse>.

    Lakukan hal ini hanya jika Anda benar-benar yakin bahwa kegagalan server backend tidak terjadi selama periode singkat/sementara.

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