Portal/Notes πŸ“
Programming

GraphQL: Query Caching

Memahami caching query GraphQL β€” parsed query cache, APQ, dan perbedaannya dengan Persisted Queries.

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

Di GraphQL, query dan parsed query merujuk pada tahapan yang berbeda dalam menangani request GraphQL.

query GetUser {
  user(id: "123") {
    id
    name
    email
  }
}

Ini adalah versi teks atau string dari request GraphQL yang dikirim klien ke server. Ini dapat dibaca manusia dan biasanya ditulis dalam bahasa query GraphQL.

Ketika server menerima request query, server kemudian mem-parsing-nya untuk memvalidasi query dengan skema yang tersedia dan menambahkan beberapa enhancement query jika memungkinkan.

Parsed query adalah format data terstruktur (biasanya tree: AST) yang mewakili komponen query (fields, arguments, fragments, dll).

Contoh representasi parsed query dari query di atas:

{
  "Operation": "query",
  "Name": "GetUser",
  "SelectionSet": [
    {
      "Field": "user",
      "Arguments": {
        "id": "123"
      },
      "SelectionSet": [
        { "Field": "id" },
        { "Field": "name" },
        { "Field": "email" }
      ]
    }
  ]
}

Parsing membutuhkan CPU yang intensif, jadi menyimpan cache parsed query (AST) mempercepat request berulang dengan melewati langkah parsing.

Parsed Query Cache

Implementasinya sederhana, kita hanya perlu menyimpan parsed query dengan key menggunakan hash dari query lengkap.

Di Go, library gqlgen memiliki fungsi SetQueryCache yang menyimpan parsed query (AST), sehingga jika query yang sama dikirim lagi, server dapat melewati langkah parsing.

srv.SetQueryCache(lru.New[*ast.QueryDocument](1000))

lru di sini hanyalah cache in-memory sederhana. Karena fungsi ini menerima interface sebagai parameter, kita dapat membuat cache kustom menggunakan redis, etcd, atau penyedia caching lain yang kita inginkan untuk sistem terdistribusi.

APQ: Automatic Persisted Queries

APQ mengoptimalkan operasi yang dikirim klien ke server GraphQL. Alih-alih mengirim string operasi lengkap, klien mengirim identifier operasi: hash unik dari string operasi.

Jika hash tidak ditemukan di server, maka klien membuat request kedua untuk mendaftarkan hash query dengan query asli di server. Untuk mengaktifkan Automatic Persisted Queries, kita perlu mengubah klien.

Cara Kerjanya

  • Pada request query pertama:
    • Klien mengirim query lengkap dan hash query.
    • Server memvalidasi hash.
    • Server menyimpan cache query dengan hash unik.
    • Eksekusi Query
  • Pada request berikutnya:
    • Klien hanya mengirim hash query.
    • Server mencari query dari cache APQ.
    • Eksekusi Query

Keuntungan

  • Mengurangi ukuran payload untuk query yang berulang.
  • Ideal untuk klien mobile atau lingkungan dengan bandwidth rendah.

Anda dapat menemukan contoh implementasi menggunakan Go di panduan ini.

Perbedaan antara APQ dan PQ (Persisted Queries)

Persisted Queries (PQ) adalah daftar query eksklusif yang telah ditentukan dan disimpan di server, dan klien hanya mengirim ID query untuk mengeksekusinya. Daftar query ini adalah operasi tepercaya dan server dapat menolak request query apa pun yang tidak ada dalam daftar.

Ini memberikan keamanan yang lebih baik karena klien hanya dapat mengeksekusi query yang telah ditentukan. Biasanya digunakan untuk operasi yang dapat berubah (mutasi).

Referensi


Edit on GitHub

Last updated on

GraphQL: Query Caching | Faisal Affan