nodejs node node.js

node.js - nodejs - Cómo utilizar los grupos Request js(Node js Module)



request node js (2)

¿Alguien puede explicar cómo usar el hash request.js pool?

Las notas de github dicen esto sobre piscinas:

pool - Un objeto hash que contiene los agentes para estas solicitudes. Si se omite, esta solicitud utilizará el grupo global que se establece en maxSockets por defecto del nodo.

pool.maxSockets - Entero que contiene la cantidad máxima de sockets en el grupo.

Tengo este código para escribir en una instancia de CouchDB (fíjese en los signos de interrogación). Básicamente, cualquier usuario que se conecte a mi servidor de nodo escribirá en el DB independientemente el uno del otro:

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); } });

¿Qué es mejor para un alto rendimiento / rendimiento?
¿Cuáles son los inconvenientes de un número alto de ''maxSockets''?
¿Cómo creo un grupo separado para usar en lugar del grupo global? ¿Por qué solo quiero crear un grupo separado?


Debería echarle un vistazo al módulo de forever-agent , que es un contenedor de http.Agent .

En general, el grupo es un objeto hash que contiene una cantidad de http agent. intenta reutilizar los sockets creados desde la conexión "keep-alive". por host: puerto. Por ejemplo, realizó varias solicitudes para alojar www.domain1.com:80 y www.domain2.com:80, si alguna de las respuestas no contiene un encabezado Connection: close , colocará el socket en el pool y lo entregará a las solicitudes pendientes.

Si no hay solicitudes pendientes que necesiten este socket agrupado, se destruirá.

maxSockets significa los sockets concurrentes máximos para un solo host: port, el valor predeterminado es 5 . Sugeriría pensar en este valor con su escenario juntos:

  • De acuerdo con esas visitas a sitios web visitados, será mejor que cree un grupo separado. para que las nuevas solicitudes puedan recoger conexiones inactivas muy rápido. el punto es que necesita reducir el número de solicitudes pendientes a ciertos sitios aumentando el valor de maxSockets de un grupo. Tenga en cuenta que no importa si establece un número muy alto para maxSockets cuando la conexión está bien administrada por el servidor de origen a través del encabezado de respuesta Connection: close .

  • Según los sitios que sus solicitudes apenas visitan, use pool: false para deshabilitar el grupo.

Puede usar de esta manera para especificar un grupo separado para su solicitud:

// 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){ });


La opción de grupo en la solicitud utiliza un agente que es el mismo que el http.Agent de la biblioteca http estándar. Consulte la documentación de http.Agent y vea las opciones del agent en http.request .

Uso

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

Si tiene curiosidad por saber qué es eso, puede verlo desde la consola.

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

El maxSockets determina cuántos sockets simultáneos el agente puede tener abierto por host, está presente en un agente de forma predeterminada con valor 5. Típicamente lo configuraría antes. Pasar pool.maxSockets explícitamente anularía la propiedad maxSockets en el pool . Esta opción solo tiene sentido si se pasa la opción de pool .

Así que diferentes formas de usarlo:

  1. No dé la opción del agent , undefined se http.globalAgent usará http.globalAgent . El caso predeterminado.
  2. Darlo como falso, deshabilitará la agrupación.
  3. Proporcione su propio agente, como el ejemplo anterior.

Respondiendo tus preguntas al revés.

El grupo está destinado a mantener cierto número de sockets para ser utilizado por el programa. En primer lugar, los sockets se reutilizan para diferentes solicitudes. Por lo tanto, reduce la sobrecarga de crear nuevos sockets. En segundo lugar, utiliza menos sockets para las solicitudes, pero de forma coherente. No ocupará todos los enchufes disponibles. En tercer lugar, mantiene la cola de solicitudes. Entonces, hay tiempo de espera implícito.

Pool actúa como un caché y un acelerador. El efecto del acelerador será más visible si tiene más solicitudes y tomas menores. Cuando se usa el pool global, puede limitar el funcionamiento de dos clientes diferentes, no hay garantías de tiempo de espera. Tener un grupo separado para ellos será más justo para ambos (piense si uno solicita más que otros).

La propiedad maxSockets brinda la máxima concurrencia posible. Aumenta el rendimiento / rendimiento general. Drawback is throttle effect is reduced. No puedes controlar los gastos generales máximos. Establecerlo en un número grande, será como no agrupar en absoluto. Comenzarías a recibir errores como socket no disponible. No puede ser más que el límite máximo permitido establecido por el sistema operativo.

Entonces, ¿qué es mejor para un alto rendimiento / rendimiento? Hay un límite físico en el rendimiento. Si alcanza el límite, el tiempo de respuesta aumentará con el número de conexiones. Puedes seguir aumentando maxSockets hasta entonces, pero después de eso, aumentarlo no ayudará.