Ini adalah masalah tanpa solusi yang memuaskan karena Anda mencoba menggabungkan persyaratan yang pada dasarnya tidak kompatibel:
-
Kirimkan hanya jumlah data yang diperlukan ke klien sesuai permintaan, yaitu Anda tidak dapat mengunduh seluruh kumpulan data, lalu memberi nomor halaman pada sisi klien.
-
Minimalkan jumlah status per klien yang harus dilacak oleh server, untuk skalabilitas dengan klien dalam jumlah besar.
-
Pertahankan status yang berbeda untuk setiap klien
Ini adalah jenis situasi "pilih dua". Anda harus berkompromi; menerima bahwa Anda tidak dapat mempertahankan status pagination setiap klien dengan tepat, menerima bahwa Anda harus mengunduh kumpulan data besar ke klien, atau menerima bahwa Anda harus menggunakan sejumlah besar sumber daya server untuk mempertahankan status klien.
Ada variasi di dalamnya yang menggabungkan berbagai kompromi, tapi itulah intinya.
Misalnya, beberapa orang akan mengirim klien beberapa data tambahan, cukup untuk memenuhi sebagian besar kebutuhan klien. Jika klien melebihi itu, maka pagination akan rusak.
Beberapa sistem akan men-cache status klien untuk waktu yang singkat (dengan tabel yang tidak masuk log berumur pendek, file temp, atau apa pun), tetapi kedaluwarsa dengan cepat, jadi jika klien tidak terus-menerus meminta data baru, pagination akan rusak.
dll.
Lihat juga:
- Bagaimana cara memberikan 1.000.000 hasil database kepada klien API?
- Menggunakan "Cursors" untuk paging di PostgreSQL
- Iterasi pada db postgres eksternal yang besar, manipulasi baris, tulis output ke rails postgres db
- pengoptimalan kinerja offset/batas
- Jika PostgreSQL count(*) selalu lambat, bagaimana cara membuat paginasi kueri kompleks?
- Cara mengembalikan baris sampel dari database satu per satu
Saya mungkin akan menerapkan solusi hibrida dalam beberapa bentuk, seperti:
-
Menggunakan kursor, baca dan segera kirim bagian pertama data ke klien.
-
Segera ambil data ekstra yang cukup dari kursor untuk memenuhi 99% kebutuhan klien. Simpan ke cache yang cepat dan tidak aman seperti memcached, Redis, BigMemory, EHCache, apa pun di bawah kunci yang memungkinkan saya mengambilnya untuk permintaan selanjutnya oleh klien yang sama. Kemudian tutup kursor untuk mengosongkan sumber daya DB.
-
Kedaluwarsa cache pada basis yang paling jarang digunakan, jadi jika klien tidak terus membaca dengan cukup cepat, mereka harus mendapatkan set data baru dari DB, dan pagination akan berubah.
-
Jika klien menginginkan lebih banyak hasil daripada sebagian besar rekan-rekannya, pagination akan berubah di beberapa titik saat Anda beralih ke pembacaan langsung dari DB daripada cache atau menghasilkan kumpulan data cache baru yang lebih besar.
Dengan begitu sebagian besar klien tidak akan melihat masalah pagination dan Anda tidak perlu mengirim data dalam jumlah besar ke sebagian besar klien, tetapi Anda tidak akan melelehkan server DB Anda. Namun, Anda memerlukan cache boofy besar untuk lolos dari ini. Kepraktisannya tergantung pada apakah klien Anda dapat mengatasi pemecahan pagination - jika tidak dapat diterima untuk memecah pagination, maka Anda terjebak dengan melakukannya di sisi DB dengan kursor, tabel temp, mengatasi seluruh hasil yang ditetapkan pada permintaan pertama, dll. Itu juga tergantung pada ukuran kumpulan data dan berapa banyak data yang biasanya dibutuhkan setiap klien.