Saya telah membuat daftar beberapa alternatif untuk manajemen koneksi di bawah ini, dalam urutan yang paling direkomendasikan.
Tingkatkan koneksi yang diizinkan di server
Batas total koneksi masuk pada server ditentukan oleh batas yang lebih rendah yang diberlakukan oleh sistem operasi atau maxIncomingConnections
(alias maxConns
dalam MongoDB 2.4 dan sebelumnya).
Biasanya distribusi Linux membatasi deskriptor file per proses hingga 1024, di mana MongoDB akan menggunakan 80% untuk koneksi masuk (menyisakan sekitar 819 koneksi yang tersedia).
Anda dapat memeriksa koneksi saat ini dan yang tersedia di mongo
shell melalui:
db.serverStatus().connections
Untuk sistem produksi, biasanya untuk menyesuaikan ulimit
pengaturan di Linux untuk memungkinkan koneksi yang lebih bersamaan. Untuk praktik terbaik lainnya, saya akan merekomendasikan meninjau Catatan Produksi di manual MongoDB.
Berikan API
Jika Anda mengelola server bersama dengan batasan sumber daya, biasanya menyediakan API Anda sendiri dan bukan akses basis data langsung. Pendekatan ini memberi Anda lapisan abstraksi ekstra sehingga Anda dapat mengelola penggunaan sumber daya dan penyebaran server terlepas dari konfigurasi klien. Sebagai contoh, Anda bisa memindahkan server database Anda atau mengkonfigurasi ulang dari standalone ke set replika, dan klien tidak harus menyadari hal ini. Anda juga dapat mengelola batas sumber daya khusus (seperti koneksi per klien) melalui API Anda, berdasarkan kredensial yang digunakan klien untuk terhubung.
Kurangi ukuran kumpulan koneksi di klien
MongoDB (seperti pada 2.6) tidak memiliki opsi untuk membatasi koneksi per klien. Biasanya batas klien akan dikenakan melalui driver (yaitu mengatur ukuran kumpulan koneksi). Misalnya, dalam pengemudi Jawa yang MongoClient
standar ukuran kolam maksimum adalah 100.
Anda telah menyarankan ini bukan opsi yang diinginkan karena Anda tidak ingin klien mengacaukan batas koneksi, tetapi jika Anda akan memaksakan batas sisi server, masih masuk akal jika mereka menetapkan ukuran kumpulan secara tepat. Kalau tidak, aplikasi mereka akan sering mendapatkan pengecualian saat Anda mematikan koneksi berlebih.
Pantau operasi klien
Jika menyesuaikan batas pada klien atau server bukan merupakan pilihan, alternatif untuk dipertimbangkan adalah mengimplementasikan skrip untuk menghitung koneksi klien bersamaan (dengan IP) melalui db.currentOp()
dan mematikan koneksi berlebih melalui db.killOp()
. Anda harus sangat berhati-hati untuk hanya membunuh permintaan klien. The killOp()
perintah adalah perintah superuser yang akan membiarkan Anda membunuh benang internal database juga (yang dapat menyebabkan hasil yang tidak terduga).
CATATAN: Pendekatan ini tidak akan berhasil jika klien Anda terhubung melalui gateway bersama (yaitu di mana IP sumber tidak secara unik mengidentifikasi klien).