MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Masalah koneksi MongoDB di Azure

Beberapa ribu permintaan per menit adalah besar memuat, dan satu-satunya cara untuk melakukannya dengan benar, adalah dengan mengontrol dan membatasi jumlah maksimum utas yang dapat dijalankan pada satu waktu.

Karena tidak banyak informasi yang diposting tentang bagaimana Anda menerapkan ini. Saya akan membahas beberapa kemungkinan keadaan.

Saatnya bereksperimen...

Konstanta:

  • Item yang akan diproses:
    • 50 per detik , atau dengan kata lain...
    • 3.000 per menit , dan satu cara lagi untuk melihatnya...
    • 180.000 per jam

Variabel:

  • Kecepatan transfer data:

    • Berapa banyak data yang dapat Anda transfer per detik akan memainkan peran apa pun yang kami lakukan, dan ini akan bervariasi sepanjang hari tergantung pada waktunya.

      Satu-satunya hal yang dapat kami lakukan adalah menjalankan lebih banyak permintaan dari cpu yang berbeda untuk mendistribusikan bobot lalu lintas yang kami kirim bolak-balik.

  • Kekuatan pemrosesan:

    • Saya berasumsi Anda memiliki ini di WebJob sebagai lawan memiliki kode ini di dalam situs MVC itu sendiri. Ini sangat tidak efisien dan tidak sesuai dengan tujuan yang ingin Anda capai. Dengan menggunakan WebJob kita dapat mengantre item pekerjaan untuk diproses oleh WebJobs lainnya . antrian yang dimaksud adalah Azure Queue Penyimpanan .

Masalahnya:

  • Kami mencoba menyelesaikan 50 transaksi per detik, jadi setiap transaksi harus diselesaikan dalam waktu kurang dari 1 detik jika kami menggunakan 50 utas. Waktu istirahat 45 detik kami tidak ada gunanya saat ini.
  • Kami mengharapkan 50 utas berjalan secara bersamaan, dan semuanya selesai dalam waktu kurang dari satu detik, setiap detik, pada satu cpu. (Saya melebih-lebihkan poin di sini, hanya untuk menegaskan... tapi bayangkan mengunduh 50 file teks setiap detik. Memprosesnya, lalu mencoba mengirimkannya kembali ke rekan dengan harapan mereka bahkan siap untuk tangkap)
  • Kita perlu memiliki logika coba lagi, jika setelah 3 kali mencoba item tidak diproses, item tersebut harus ditempatkan kembali ke antrian. Idealnya kita harus menyediakan lebih banyak waktu ke server untuk merespons daripada hanya satu detik dengan setiap kegagalan, katakanlah kita memberinya jeda 2 detik pada kegagalan pertama, lalu 4 detik, lalu 10, ini akan sangat meningkatkan kemungkinan kita bertahan / mengambil data yang kita butuhkan.
  • Kami berasumsi bahwa MongoDb our kami dapat menangani jumlah permintaan ini per detik. Jika Anda belum melakukannya, mulailah mencari cara untuk menskalakannya, masalahnya bukan pada fakta bahwa itu adalah MongoDb, lapisan datanya bisa apa saja, ini adalah fakta bahwa kami membuat sejumlah permintaan dari satu sumber yang kemungkinan besar menjadi penyebab masalah Anda.

Solusinya:

  1. Siapkan WebJob dan beri nama EnqueueJob . WebJob . ini akan memiliki satu tujuan tunggal, untuk mengantri item pekerjaan untuk diproses di Queue Storage .
  2. Buat Queue Storage Container bernama WorkItemQueue , antrean ini akan bertindak sebagai pemicu ke langkah berikutnya dan memulai operasi penskalaan kami.
  3. Buat WebJob lainnya bernama DequeueJob . WebJob . ini juga akan memiliki satu tujuan tunggal, untuk menghapus item pekerjaan dari WorkItemQueue dan jalankan permintaan ke penyimpanan data Anda.
  4. Konfigurasikan DequeueJob untuk berputar setelah item ditempatkan di dalam WorkItemQueue , mulai 5 utas terpisah pada masing-masing dan sementara antrian tidak kosong, dequeue item pekerjaan untuk setiap utas dan coba jalankan pekerjaan dequeued.
    1. Coba 1, jika gagal, tunggu &coba lagi.
    2. Coba 2, jika gagal, tunggu &coba lagi.
    3. Upaya 3, jika gagal, antrekan item kembali ke WorkItemQueue
  5. Konfigurasikan situs web Anda untuk melakukan penskalaan otomatis ke x jumlah cpu (perhatikan bahwa situs web dan pekerjaan web Anda berbagi sumber daya yang sama)

Berikut adalah video singkat 10 menit yang memberikan ikhtisar tentang cara memanfaatkan penyimpanan antrean dan tugas web.

Sunting:

Alasan lain Anda mungkin mendapatkan kesalahan tersebut bisa jadi karena dua faktor lain juga, lagi-lagi disebabkan karena kesalahan tersebut berada di aplikasi MVC...

Jika Anda mengkompilasi aplikasi dengan DEBUG atribut diterapkan tetapi mendorong RELEASE versi sebaliknya, Anda mungkin mengalami masalah karena pengaturan di web.config . Anda , tanpa DEBUG atribut, aplikasi web ASP.NET akan menjalankan permintaan selama maksimal 90 detik, jika permintaan memakan waktu lebih lama dari ini, itu akan membuang permintaan.

Untuk menambah waktu tunggu lebih lama dari 90 detik anda perlu mengubah [httpRuntime][3] properti di web.config . Anda ...

<!-- Increase timeout to five minutes -->
<httpRuntime executionTimeout="300" />

Hal lain yang perlu Anda perhatikan adalah pengaturan batas waktu permintaan browser Anda> aplikasi web, saya akan mengatakan bahwa jika Anda bersikeras menyimpan kode di MVC daripada mengekstraknya dan memasukkannya ke dalam WebJob, maka Anda dapat menggunakan kode berikut untuk mengaktifkan permintaan ke aplikasi web Anda dan mengimbangi waktu tunggu permintaan.

string html = string.Empty;
string uri = "http://google.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Timeout = TimeSpan.FromMinutes(5);

using (HttpWebResponse response = (HttpWebResonse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    html = reader.ReadToEnd();
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. API javascript sisi klien Mongodb

  2. Kemungkinan permintaan dengan MongoDB

  3. Jika nilai properti adalah nol saat memperbarui maka properti itu tidak boleh ditambahkan ke catatan

  4. Perbedaan antara mayoritas dan dapat dilinierkan

  5. Urutan Mongo berdasarkan panjang array