sql >> Base de Datos >  >> NoSQL >> Redis

Cómo visualizar el uso de Resque con Node.js, WebSockets y Redis

¿Alguna vez quiso visualizar cómo están sus colas, trabajadores y trabajos de Resque? En este artículo, vamos a aprender cómo construir algunos gráficos simples alrededor de los componentes de Resque.

Delegación de trabajos a una cola en segundo plano

La delegación de trabajos de larga duración, computacionalmente costosos y de alta latencia a una cola de trabajo en segundo plano es un patrón común que se usa para crear aplicaciones web escalables. El objetivo es atender las solicitudes de los usuarios finales con la respuesta más rápida posible al garantizar que todos los trabajos costosos se manejen fuera del ciclo de solicitud/respuesta.

Resque

Resque es una biblioteca de Ruby respaldada por Redis para crear trabajos en segundo plano, colocarlos en varias colas y procesarlos más tarde. Está diseñado para su uso en escenarios que requieren un gran volumen de entradas de trabajo, ya que Resque proporciona mecanismos para garantizar la visibilidad y la confiabilidad del comportamiento mientras transmite estadísticas a través de un panel web.

Redis

Redis es un almacén de estructura de datos en memoria de código abierto (con licencia BSD), que se utiliza como base de datos, caché y agente de mensajes. Admite estructuras de datos como cadenas, hashes, listas, conjuntos, conjuntos ordenados con consultas de rango, mapas de bits, hiperloglogs e índices geoespaciales con consultas de radio.

Node.js

Node.js es una plataforma construida sobre el tiempo de ejecución de JavaScript de Chrome para crear fácilmente aplicaciones de red rápidas y escalables. Node.js utiliza un modelo de E/S sin bloqueo y controlado por eventos que lo hace liviano y eficiente y, por lo tanto, perfecto para aplicaciones en tiempo real con uso intensivo de datos que se ejecutan en dispositivos distribuidos.

Express.js

Express.js es un marco de Node.js. Node.js es una plataforma que permite utilizar JavaScript fuera de los navegadores web, para crear aplicaciones web y de red. Esto significa que puede crear el servidor y el código del lado del servidor para una aplicación como la mayoría de los otros lenguajes web, pero usando JavaScript.

Socket.IO

Socket.IO es una biblioteca de JavaScript para aplicaciones web en tiempo real. Permite la comunicación bidireccional en tiempo real entre clientes web y servidores. Tiene dos partes:una biblioteca del lado del cliente que se ejecuta en el navegador y una biblioteca del lado del servidor para Node.js. Ambos componentes tienen API casi idénticas.

Héroe

Heroku es una plataforma en la nube que permite a las empresas crear, entregar, monitorear y escalar aplicaciones; es la forma más rápida de pasar de la idea a la URL, evitando todos esos dolores de cabeza de infraestructura.

Este artículo asume que ya tiene Redis, Node.js y Heroku Toolbelt instalados en su máquina.

Configuración:

  1. Descargue el código del repositorio de ScaleGrid.
  2. Ejecute npm install para instalar los componentes necesarios.
  3. Finalmente, puede iniciar el servidor de nodos haciendo "node index.js". También puede ejecutar "nodemon", que también observa los cambios en los archivos.

También puede acceder a una versión alojada de esta aplicación aquí.

Nuestra aplicación utiliza un puerto de Resque llamado node-resque que nos permite observar las colas, los trabajadores y los trabajos que se ejecutan en un clúster de Redis.

Comprender los conceptos básicos

Tan pronto como inicie la aplicación, deberá ingresar sus credenciales de clúster de Redis. Tenga en cuenta que debe tener Resque instalado y ejecutándose en su clúster para que esto funcione correctamente.

Afortunadamente, ScaleGrid for Redis™* totalmente administrado proporciona una solución de alojamiento de alto rendimiento con un solo clic para Redis™. Si aún no es miembro, puede registrarse para obtener una prueba gratuita de 30 días aquí para comenzar.

De lo contrario, inicie sesión en su tablero y cree un nuevo clúster de Redis™ en la sección Redis™. Una vez que su clúster esté en funcionamiento, puede obtener los detalles necesarios en la página de detalles del clúster. Necesitará la siguiente información:

  1. Anfitrión
  2. Puerto
  3. Contraseña

Si la conexión es exitosa, debería ver gráficos como los siguientes:

Analicemos cada uno de estos gráficos en detalle. Tenga en cuenta que todos los gráficos se actualizan automáticamente, por lo que si los trabajadores están procesando trabajos en su clúster, los gráficos se actualizarán automáticamente.

Total de tareas en todas las colas

Los gráficos anteriores muestran la cantidad total de colas Resque en su clúster y la cantidad de trabajos contenidos en cada cola. Resque almacena una cola de trabajos en una lista de Redis llamada "resque:queue:name", y cada elemento de la lista es un hash serializado como una cadena JSON. Redis también tiene sus propias estructuras de gestión, incluida una lista de trabajos "fallidos". Resque asigna espacios de nombres a sus datos dentro de Redis con el prefijo "resque:", para que pueda compartirse con otros usuarios.

Histograma de trabajadores/empleos

Un trabajador de Resque procesa trabajos. En las plataformas que admiten bifurcación (2), el trabajador bifurcará a un niño para procesar cada trabajo. Esto garantiza un borrón y cuenta nueva al comenzar el siguiente trabajo y reduce el crecimiento gradual de la memoria, así como las fallas de bajo nivel.

También garantiza que los trabajadores siempre escuchen las señales de usted, su maestro, y puedan reaccionar en consecuencia.

El gráfico anterior muestra todos los trabajadores en el clúster de Redis. Un estado de 1 indica que se ha asignado un trabajo al trabajador y está en curso, y un estado de 0 indica que el trabajador está libre/inactivo.

Estado del trabajo

Un trabajo de Resque representa una unidad de trabajo. Cada trabajo vive en una sola cola y tiene un objeto de carga útil asociado. La carga útil es un hash con dos atributos:`clase` y `args`. La `clase` es el nombre de la clase de Ruby que debe usarse para ejecutar el trabajo. Los `args` son una matriz de argumentos que deben pasarse al método de nivel de clase `perform` de la clase Ruby.

El gráfico anterior muestra el estado de los trabajos como procesados ​​o fallidos. Un trabajo se agrega al estado fallido si el trabajador no pudo ejecutarlo. Este es un ejemplo de un objeto de trabajo simple.

var jobs = {
  "add": {
    plugins: [ 'jobLock', 'retry' ],
    pluginOptions: {
      jobLock: {},
      retry: {
        retryLimit: 3,
        retryDelay: (1000 * 5),
      }
    },
    perform: function(a,b,callback){
      var answer = a + b;
      callback(null, answer);
    },
  },
  "subtract": {
    perform: function(a,b,callback){
      var answer = a - b;
      callback(null, answer);
    },
  },
};

  • Una versión alojada está disponible aquí.
  • Para implementar esta aplicación en Heroku, consulte sus documentos.
  • El código fuente completo también está disponible en GitHub para que lo bifurques y trabajes aquí.

Como siempre, si construyes algo asombroso, envíanos un tweet al respecto @scalegridio.