Soru Request js (Node js Module) havuzları nasıl kullanılır


Birisi request.js havuzu karma kullanımını nasıl kullanabileceğinizi açıklayabilir mi?

github notları Havuzlar hakkında şunu söyleyin:

pool - Bu istekler için aracıları içeren bir karma nesne. Bunu ihmal ettiyseniz   istek, düğümün varsayılan maxSockets'ına ayarlanmış global havuzu kullanır.

pool.maxSockets - Havuzdaki maksimum yuva sayısını içeren Tamsayı.

CouchDB örneğine yazmak için bu koda sahibim (soru işaretlerini not edin). Temel olarak, Düğüm sunucuma bağlanan herhangi bir kullanıcı DB'ye birbirinden bağımsız olarak yazacaktır:

var request = require('request');

request({
    //pool:,     //  ??????????????????
    'pool.maxSockets' : 100,  //  ??????????????????
    'method' : 'PUT',
    'timeout' : 4000,
    'strictSSL' : true,
    'auth' : {
        'username' : myUsername,
        'password' : myPassword
    },
    'headers' : {
        'Content-Type': 'application/json;charset=utf-8',
        'Content-Length': myData.length
    },
    'json' : myData,
    'url': myURL
}, function (error, response, body){
    if (error == null) {
        log('Success: ' + body);
    }
    else {
        log('Error: ' + error);
    }
});

Yüksek verim / performans için en iyi olan nedir?
Yüksek 'maxSockets' sayısının sakıncaları nelerdir?
Genel havuz yerine kullanmak için ayrı bir havuz nasıl oluşturabilirim? Neden sadece ayrı bir havuz oluşturmak istiyorum?


32
2017-09-27 05:34


Menşei




Cevaplar:


İstekte bulunan havuz seçeneği, aynı olan aracı kullanır http.Agent standart http kütüphanesinden. İçin belgelere bakın http.Agent ve bakın agent içindeki seçenekler http.request.

kullanım

pool = new http.Agent(); //Your pool/agent
http.request({hostname:'localhost', port:80, path:'/', agent:pool});
request({url:"http://www.google.com", pool:pool });

Ne olduğunu merak ediyorsanız, onu konsoldan görebilirsiniz.

{ domain: null,
  _events: { free: [Function] },
  _maxListeners: 10,
  options: {},
  requests: {},
  sockets: {},
  maxSockets: 5,
  createConnection: [Function] }

maxSockets ajanın ana makine başına ne kadar eşzamanlı sokete sahip olabileceğini belirler, varsayılan olarak 5 değeriyle bir aracıda bulunur. Genellikle önceden ayarlamış olursunuz. Geçen pool.maxSockets açıkça, maxSockets özelliğini geçersiz kılar pool. Bu seçenek sadece geçiyorsa anlamlıdır pool seçeneği.

Bunu kullanmak için farklı yollar:

  1. Verme agent seçenek olacak undefined kullanacak http.globalAgent. Varsayılan durum.
  2. Yanlış olarak ver, havuzu devre dışı bırakır.
  3. Yukarıdaki gibi, kendi aracınızı verin.

Sorularınızı tersine cevaplamak.

Havuz, program tarafından kullanılacak belirli sayıda soketi bulundurmak içindir. İlk olarak, farklı talepler için soketler yeniden kullanılır. Böylece yeni prizler yaratmanın yükünü azaltır. İkinci olarak, istekler için daha az sayıda soket kullanır, ancak sürekli olarak. Mevcut tüm soketleri almayacaktır. Üçüncü olarak, isteklerin kuyruğunu sürdürür. Yani bekleme zamanı var.

Havuz hem önbellek hem de gaz kelebeği gibi davranır. Daha fazla istek ve daha az soketiniz varsa gaz kelebeği etkisi daha görünür olacaktır. Global havuzu kullanırken iki farklı müşterinin çalışmasını sınırlayabilir, bekleme süresinde herhangi bir garanti yoktur. Onlar için ayrı havuza sahip olmak, her ikisine de daha adil olacaktır (biri diğerinden daha fazlasını isterse düşünün).

MaxSockets özelliği, maksimum eşzamanlılık mümkün kılar. Toplam verimi / performansı arttırır. Geri çekilme, gaz etkisi azalır. Pik yükü kontrol edemezsiniz. Çok sayıya ayarlandığında, hiçbir havuzlama olmayacak. Soket mevcut değil gibi hatalar almaya başlayacaksınız. İşletim sistemi tarafından belirlenen izin verilen maksimum sınırdan fazla olamaz.

Öyleyse, yüksek verimlilik / performans için en iyi olan nedir? Çıktıda fiziksel bir sınır var. Limite ulaşırsanız, bağlantı sayısı ile bağlantı süresi artar. O zamana kadar maxSockets'ı artırmaya devam edebilirsiniz, ancak bu artmadan sonra yardımcı olmaz.


42
2017-09-30 18:29



İlk Kullanım örneğinizde, ikinci satırın noktası nedir? http.request( {...} ); - Bu, çekirdek HTTP modülünü kullanırken işe yarayacağını göstermek için havuzun kullanılması için havuzun düzgün bir şekilde başlatılması amacıyla çağrılması gereken bir ifadedir. request kütüphane? Teşekkürler!
Cevabınız, şu ana kadar Ajan havuzlarında elde ettiğim en iyi kaynak ve bunları kullanmanın artıları ve eksileri. Bunu yazmak için zaman ayırdığınız için çok teşekkürler (y) - Aditya Singh
NOT son sürümleri node.js bir şeye sahip Infinity olarak maxSockets varsayılan olarak. - K._


Bir göz atmalısın Sonsuza aracısı bir sarıcı olan modül http.Agent.

Genellikle havuz, bir dizi http ajanı içeren bir karma nesnedir. "canlı tutma" bağlantısından oluşturulan yuvaları yeniden kullanmayı dener. ana bilgisayar başına: bağlantı noktası. Örneğin, herhangi bir yanıt içermiyorsa, www.domain1.com:80 ve www.domain2.com:80 barındırmak için birkaç istek gerçekleştirdiniz. Connection: closeSoketi havuza koyar ve bekleyen istekleri verir.

Bekleyen istekleri bu havuzlanmış yuvaya gerek duymazsa, yok olur.

maxSockets tek bir ana bilgisayar için maksimum eşzamanlı soket anlamına gelir: port, varsayılan değer 5. Bu değeri senaryonuzla birlikte düşünmenizi öneririm:

  • Bu sıcak sitelere yapılan ziyaretlere göre, ayrı bir havuz oluşturmalısınız. Böylece yeni talepler rölanti soketlerini çok hızlı alabilir. Önemli olan, belirli sitelere giden isteklerin sayısını artırarak azaltmanız gerektiğidir. maxSockets bir havuzun değeri. Çok yüksek bir sayı ayarlayıp farketmediğine dikkat edin. maxSockets Bağlantı, kaynak sunucu tarafından yanıt başlığı ile iyi yönetildiğinde Connection: close.

  • İsteklerinizin zorlukla ziyaret ettiği sitelere göre pool: false havuzu devre dışı bırakmak için

İsteğiniz için ayrı havuz belirtmek için bu şekilde kullanabilirsiniz:

// create a separate socket pool with 10 concurrent sockets as max value.
var separateReqPool = {maxSockets: 10};
var request = require('request');

request({url: 'http://localhost:8080/', pool: separateReqPool}, function(e, resp){
});

13
2017-09-30 01:53



Bu "sepearateReqPool" benim için işe yaradı ve çok daha az kod oldu. Sonsuza kadar ajan bit hakkında emin değilim (denemedim), ama ikinci yarısı çok yardımcı oldu. - jeremy
Havuz ayarlarsam işletim sistemi devredecek mi? Demek istediğim, hala canlı bağlantıları yeniden kullanacak mı yoksa bu özel uygulama mantığı mı? - lucaswxp
@lucaswxp işletim sisteminin http tutma-canavarı hakkında hiçbir fikri yoktur ve devralmayacaktır. - Jason Martin