PERBARUI :Artikel dukungan kami untuk topik ini (pada dasarnya salinan posting ini) telah dipindahkan ke dokumen pemecahan masalah koneksi kami.
Ada masalah yang diketahui bahwa jaringan Azure IaaS memberlakukan batas waktu idle sekitar tiga belas menit (secara empiris tiba di). Kami bekerja dengan Azure untuk melihat apakah kami tidak dapat membuat segalanya lebih ramah pengguna, tetapi sementara itu yang lain telah berhasil dengan mengonfigurasi opsi driver mereka untuk mengatasi masalah tersebut.
Waktu idle koneksi maksimum
Solusi paling efektif yang kami temukan dalam bekerja dengan Azure dan pelanggan kami adalah menyetel waktu idle koneksi maksimal di bawah empat menit. Idenya adalah membuat driver mendaur ulang koneksi idle sebelum firewall memaksa masalah. Misalnya, satu pelanggan, yang menggunakan driver C#, menyetel MongoDefaults.MaxConnectionIdleTime
menjadi satu menit dan itu menyelesaikan masalah mereka.
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);
Kode aplikasi itu sendiri tidak berubah, tetapi sekarang di belakang layar, pengemudi secara agresif mendaur ulang koneksi yang tidak aktif. Hasilnya juga dapat dilihat di log server:banyak koneksi terputus selama periode idle di aplikasi.
Ada detail lebih lanjut tentang pendekatan ini di utas pengguna mongo terkait, SocketException menggunakan driver C# di Azure.
Keepalive
Anda juga dapat mengatasi masalah ini dengan membuat koneksi Anda tidak terlalu menganggur dengan semacam keepalive. Ini sedikit rumit untuk diterapkan kecuali driver Anda mendukungnya, biasanya dengan memanfaatkan TCP Keepalive. Jika Anda perlu melakukan roll sendiri, pastikan untuk mengambil setiap koneksi idle dari pool setiap beberapa menit dan mengeluarkan beberapa perintah sederhana dan murah, mungkin ping.
Menangani pemutusan sambungan
Pemutusan sambungan dapat terjadi dari waktu ke waktu bahkan tanpa pengaturan firewall yang agresif. Sebelum masuk ke produksi, pastikan Anda menanganinya dengan benar.
Pertama, pastikan untuk mengaktifkan koneksi ulang otomatis. Cara melakukannya bervariasi dari driver ke driver, tetapi ketika driver mendeteksi bahwa operasi gagal karena koneksi yang buruk menyalakan auto reconnect memberitahu pengemudi untuk mencoba menyambung kembali.
Tapi ini tidak sepenuhnya menyelesaikan masalah. Anda masih memiliki masalah tentang apa yang harus dilakukan dengan operasi yang gagal yang memicu penyambungan kembali. Sambung ulang otomatis tidak secara otomatis mencoba kembali operasi yang gagal. Itu akan berbahaya, terutama untuk menulis. Jadi biasanya pengecualian dilemparkan dan aplikasi diminta untuk menanganinya. Sering mencoba membaca kembali bukanlah hal yang sulit. Tetapi mencoba menulis ulang harus dipertimbangkan dengan cermat.
Sesi mongo shell di bawah ini menunjukkan masalahnya. Shell mongo secara default telah mengaktifkan koneksi ulang otomatis. Saya memasukkan dokumen ke dalam koleksi bernama stuff
kemudian temukan semua dokumen dalam koleksi itu. Saya kemudian mengatur timer selama tiga puluh menit dan mencoba menemukan yang sama lagi. Gagal, tetapi shell secara otomatis terhubung kembali dan ketika saya segera mencoba kembali, ternyata berfungsi seperti yang diharapkan.
% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p ***
MongoDB shell version: 2.2.2
connecting to: ds012345.mongolab.com:12345/mydatabase
> db.stuff.insert({})
> db.stuff.find()
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
> db.stuff.find()
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345]
Fri Jan 18 13:29:28 DBClientCursor::init call() failed
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345
Error: error doing query: failed
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok
> db.stuff.find()
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
Kami siap membantu
Tentu saja, jika Anda memiliki pertanyaan, jangan ragu untuk menghubungi kami di [email protected] Kami siap membantu.