Apakah ada kerugian dari GraphQL? [Tutup]

101

Semua artikel tentang GraphQL akan memberi tahu Anda betapa indahnya GraphQL, tetapi apakah ada kekurangan atau kekurangannya? Terima kasih.

Dr. Nemo
sumber

Jawaban:

95

Kekurangan:

  • Anda perlu mempelajari cara mengatur GraphQL. Ekosistemnya masih berkembang pesat jadi Anda harus mengikutinya.
  • Anda perlu mengirim kueri dari klien, Anda bisa mengirim string tetapi jika Anda ingin lebih nyaman dan caching Anda akan menggunakan perpustakaan klien -> kode tambahan di klien Anda
  • Anda perlu menentukan skema terlebih dahulu => pekerjaan ekstra sebelum Anda mendapatkan hasil
  • Anda harus memiliki titik akhir graphql di server Anda => perpustakaan baru yang belum Anda ketahui
  • Kueri graphql lebih banyak byte daripada sekadar pergi ke titik akhir REST
  • Server perlu melakukan lebih banyak pemrosesan untuk mengurai kueri dan memverifikasi parameter

Tapi, itu lebih dari diimbangi oleh ini:

  • GraphQL tidak terlalu sulit untuk dipelajari
  • Kode ekstra hanya beberapa KB
  • Dengan menentukan skema, Anda akan mencegah lebih banyak pekerjaan setelah itu memperbaiki bug dan menanggung pemutakhiran berbulu
  • Ada banyak orang yang beralih ke GraphQL sehingga ada ekosistem yang kaya yang berkembang, dengan perkakas yang sangat baik
  • Saat menggunakan kueri persisten dalam produksi (mengganti kueri GraphQL hanya dengan ID dan parameter), Anda sebenarnya mengirim lebih sedikit byte daripada dengan REST
  • Pemrosesan ekstra untuk kueri yang masuk dapat diabaikan
  • Menyediakan decoupling yang bersih dari API dan backend memungkinkan iterasi yang jauh lebih cepat pada improvisasi backend
w00t
sumber
1
"Anda perlu menentukan skema terlebih dahulu => pekerjaan ekstra sebelum Anda mendapatkan hasil" Saya tidak melihat bagaimana ini tidak diperlukan tanpa GraphQL? Tentu dengan beberapa kerangka kerja dalam beberapa bahasa itu tidak diperlukan, tetapi misalnya untuk API Java Anda masih harus menjelaskan "skema" dalam model Anda.
AntoineB
3
@AntoineB Anda benar, di NodeJS bagaimanapun Anda dapat dengan mudah membuat REST API tanpa pernah memikirkan tentang skema keseluruhan; kembalikan saja.
w00t
1
@ w00t dan segera setelah Anda membutuhkan beberapa parameter dengan REST, Anda akan menggunakan penguraian URL untuk memeriksa bahwa jenis parameter sudah benar, memberikan nilai 400 jika tidak. Jika saja ada sesuatu yang harus dihindari untuk melakukan ini secara manual di setiap penangan rute: D
Capaj
Dengan Spring Boot, Anda dapat menarik beberapa artefak graphql-spring-boot-starterdan graphql-java-toolsmemulai. Buat skema Anda di sumber daya .graphqls dan buat kelas Resolver dan selesai. Untuk mendapatkan contoh uji kerja dan berjalan membutuhkan waktu sekitar 10 menit.
Babyburger
1
Saya tidak setuju dengan semua kerugiannya, sebenarnya itu menghemat banyak waktu Anda periksa posting ini xalitech.com/graphql-how-to-convince-your-boss
Shafqat Ali
58

Saya telah menemukan beberapa masalah penting bagi siapa pun yang mempertimbangkan untuk menggunakan GraphQL , dan hingga saat ini poin utamanya adalah:

Query In Indefinite Depth : GraphQL tidak dapat melakukan query dalam kedalaman yang tidak terbatas, jadi jika Anda memiliki pohon dan ingin mengembalikan cabang tanpa mengetahui kedalamannya, Anda harus melakukan beberapa pagination.

Struktur Respon Spesifik : Di GraphQL, responnya sesuai dengan bentuk kueri, jadi jika Anda perlu merespons dalam struktur yang sangat spesifik, Anda harus menambahkan lapisan transformasi untuk membentuk kembali respons.

Cache di Tingkat Jaringan : Karena cara umum GraphQL digunakan melalui HTTP (POST dalam satu titik akhir), cache di tingkat jaringan menjadi sulit. Salah satu cara untuk mengatasinya adalah dengan menggunakan Persisted Queries.

Menangani Unggahan File : Tidak ada tentang unggahan file dalam spesifikasi GraphQL dan mutasi tidak menerima file dalam argumen. Untuk mengatasinya, Anda dapat mengunggah file menggunakan jenis API lain (seperti REST) ​​dan meneruskan URL file yang diunggah ke mutasi GraphQL, atau menyuntikkan file dalam konteks eksekusi, sehingga Anda akan memiliki file di dalam fungsi resolver.

Eksekusi Tidak Dapat Diprediksi: Sifat GraphQL adalah Anda dapat melakukan kueri dengan menggabungkan bidang apa pun yang Anda inginkan, tetapi fleksibilitas ini tidak gratis. Ada beberapa masalah yang perlu diketahui seperti Performa dan Kueri N + 1.

Super Simple API : Jika Anda memiliki layanan yang mengekspos API yang sangat sederhana, GraphQL hanya akan menambahkan kompleksitas ekstra, jadi REST API sederhana bisa lebih baik.

Bruno Soares
sumber
2
Untuk kedalaman yang tidak terbatas, saya menggunakan tanggapan JsonType. Ini tidak diketik dengan kuat, jadi Anda perlu memeriksa input, tetapi ini bisa sangat berguna.
w00t
3
REST selalu memiliki masalah N + 1 Queries. Satu-satunya perbedaan adalah bahwa dengan desain REST melarang backend bahkan mencoba untuk menyelesaikan masalah. Sebaliknya itu mendorong masalah di frontend.
Capaj
39

Masalah terbesar yang saya lihat dengan graphQL yaitu jika Anda menggunakan dengan database relasional adalah dengan bergabung .

  1. Fakta bahwa Anda dapat mengizinkan / melarang beberapa bidang membuat gabungan tidak sepele (tidak sederhana). Yang mengarah ke pertanyaan tambahan.

  2. Kueri bersarang di graphql juga mengarah ke kueri melingkar dan dapat merusak server . Perhatian ekstra harus diberikan.

  3. Pembatasan tarif panggilan menjadi sulit karena sekarang pengguna dapat mengaktifkan beberapa kueri dalam satu panggilan.

TIPS : Gunakan dataloader facebook untuk mengurangi jumlah kueri dalam kasus javascript / node

aWebDeveloper
sumber
1. Bagaimana bidang yang dipilih relevan untuk bergabung dalam operasi? 2. Tidak jika Anda menggunakan pemuat data. 3. Anda dapat mengurai dan menetapkan costpermintaan. Juga ini bukan masalah jika Anda menggunakan kueri yang telah ditentukan sebelumnya, di mana klien hanya mengirimkan ID.
zoran404
1
setuju dengan 2. Dengan 3 sedikit kerja ekstra dan yang lebih penting ppl perlu diperhatikan.
aWebDeveloper
2. Ini tidak berlaku lagi karena Anda dapat menggunakan banyak alat untuk melindungi server Anda. Misalnya tautan: howtographql.com/advanced/4-security Timeout, batasi kompleksitas dan kedalaman. Jadi ini sama seperti Anda akan mengatakan bahwa REST Anda akan dimungkinkan untuk DDoS jika Anda tidak menggunakan pembatas tarif. Hal-hal berubah
Yevhenii Herasymchuk
memperbarui poin 2
aWebDeveloper
13

Semakin baik dan lebih baik setiap tahun, dan untuk saat ini, komunitas GraphQL berkembang, dan sebagai hasilnya, ada lebih banyak solusi untuk banyak masalah yang disorot dalam jawaban lain sebelumnya. Tetapi untuk mengakui apa yang masih menahan perusahaan dari membuang semua sumber daya ke GraphQL, saya ingin membuat daftar beberapa masalah dan solusi yang diikuti oleh yang belum terpecahkan.

  • Cache di Tingkat Jaringan - seperti yang dikatakan Bruno itu Persisted Queries dan tentu saja Anda dapat menyimpan cache di klien dan tidak ada yang menghentikan Anda untuk menggunakan cache di tingkat database atau bahkan Redis. Tetapi tentu saja karena GraphQL hanya memiliki satu titik akhir dan setiap kueri berbeda - jauh lebih rumit untuk melakukan jenis caching ini daripada dengan REST.
  • Kueri bersarang di GraphQL mengarah ke kueri melingkar dan dapat merusak server - bukan masalah lagi dengan berbagai macam solusi. Beberapa di antaranya tercantum di sini
  • Penanganan Upload File - kami telah banyak dari solusi untuk itu

Tetapi ada beberapa kasus lagi yang dapat dianggap sebagai kerugian:

  • kelebihan boilerplate (maksud saya, untuk membuat misalnya kueri baru Anda perlu menentukan skema, resolver dan di dalam resolver untuk secara eksplisit mengatakan GraphQL cara menyelesaikan data dan bidang Anda di dalamnya, di sisi klien buat kueri dengan bidang yang persis terkait dengan data ini)
  • penanganan kesalahan - Saya perlu mengatakan bahwa ini lebih terkait dengan perbandingan dengan REST. Ini dimungkinkan di sini dengan apollo tetapi pada saat yang sama itu jauh lebih rumit daripada di REST
  • otentikasi dan otorisasi - tapi seperti yang saya katakan masyarakat meningkat dengan kecepatan yang luar biasa dan ada sudah beberapa dari solusi untuk tujuan ini.

Singkatnya, GraphQL hanyalah alat untuk tujuan tertentu dan yang pasti ini bukan solusi tepat untuk semua masalah dan tentu saja bukan pengganti REST.

Yevhenii Herasymchuk
sumber
3

Sangat menyenangkan memiliki satu titik akhir dan mengekspos semua data. Saya menemukan poin-poin di bawah ini untuk dipertimbangkan untuk GraphQL:

  1. Penerapan Download / Upload File menjadi rumit (mengonversi ke string mungkin bukan pilihan terbaik untuk file besar)
  2. Banyak kode boilerplate dan skema di frontend dan backend.
  3. Ikuti dan dukung pagination yang disediakan dalam spesifikasi GraphQL.
  4. Izinkan urutan kustom dan logika prioritas untuk pengurutan bidang. Contoh jika kita mengambil data pengguna dan grup serta peran terkait. Seorang pengguna dapat menyortir banyak data berdasarkan nama pengguna, nama grup atau nama peran.
  5. Otentikasi dan Otorisasi akan bergantung pada kerangka kerja backend.
  6. Pastikan pengoptimalan backend dan dukungan Database untuk mengaktifkan kueri tunggal untuk setiap perintah graphql mungkin menjadi rumit.

Juga, seseorang harus mempertimbangkan Pro setelah implementasinya:

  1. Sangat fleksibel untuk mendukung item baru dan memperbarui perilaku yang ada.
  2. Mudah untuk menambahkan kondisi menggunakan argumen dan urutan kustom setelah diterapkan

  3. Gunakan banyak filter khusus dan singkirkan semua tindakan yang perlu dibuat misalnya pengguna dapat memiliki id, nama, dll sebagai argumen dan melakukan pemfilteran. Selain itu, filter juga dapat diterapkan pada grup di pengguna.

  4. Kemudahan pengujian API dengan membuat file yang berisi semua kueri dan mutasi GraphQL.
  5. Mutasi bersifat langsung dan mudah diterapkan setelah konsepnya dipahami.
  6. Cara ampuh untuk mengambil berbagai kedalaman data.
  7. Dukungan Voyager dan GraphiQL UI atau Playground membuatnya mudah dilihat dan digunakan.
  8. Kemudahan dokumentasi saat menentukan skema dengan metode deskripsi yang valid.
vCillusion
sumber
3

Saya pikir graphql untuk saat ini harus menjadi bagian dari arsitektur backend, untuk unggahan file Anda masih menggunakan api biasa

pengguna998548
sumber