Hai mai desiderato visualizzare come stanno andando le tue code, i tuoi dipendenti e i tuoi lavori Resque? In questo articolo impareremo come costruire alcuni semplici grafici attorno ai componenti di Resque.
Delega dei lavori a una coda in background
La delega di lavori di lunga durata, computazionalmente costosi e ad alta latenza a una coda di lavoro in background è un modello comune utilizzato per creare applicazioni Web scalabili. L'obiettivo è soddisfare le richieste degli utenti finali con la risposta più rapida possibile, garantendo che tutti i lavori costosi vengano gestiti al di fuori del ciclo di richiesta/risposta.
Richiedi
Resque è una libreria Ruby supportata da Redis per creare lavori in background, posizionarli su più code ed elaborarli in un secondo momento. È progettato per l'uso in scenari che richiedono un volume elevato di voci di lavoro poiché Resque fornisce meccanismi per garantire visibilità e affidabilità del comportamento durante la trasmissione di statistiche tramite una dashboard web.
Redis
Redis è un archivio di strutture dati in memoria open source (con licenza BSD), utilizzato come database, cache e broker di messaggi. Supporta strutture di dati come stringhe, hash, elenchi, set, set ordinati con query di intervallo, bitmap, hyperloglog e indici geospaziali con query di raggio.
Node.js
Node.js è una piattaforma basata sul runtime JavaScript di Chrome per creare facilmente applicazioni di rete veloci e scalabili. Node.js utilizza un modello I/O non bloccante basato su eventi che lo rende leggero ed efficiente e quindi perfetto per applicazioni in tempo reale ad alta intensità di dati che funzionano su dispositivi distribuiti.
Express.js
Express.js è un framework Node.js. Node.js è una piattaforma che consente di utilizzare JavaScript al di fuori dei browser Web, per la creazione di applicazioni Web e di rete. Ciò significa che puoi creare il server e il codice lato server per un'applicazione come la maggior parte degli altri linguaggi web, ma utilizzando JavaScript.
Socket.IO
Socket.IO è una libreria JavaScript per applicazioni Web in tempo reale. Consente la comunicazione bidirezionale in tempo reale tra client Web e server. Ha due parti:una libreria lato client che viene eseguita sul browser e una libreria lato server per Node.js. Entrambi i componenti hanno API quasi identiche.
Heroku
Heroku è una piattaforma cloud che consente alle aziende di creare, distribuire, monitorare e ridimensionare le app:è il modo più veloce per passare dall'idea all'URL, aggirando tutti quei grattacapi dell'infrastruttura.
Questo articolo presuppone che tu abbia già Redis, Node.js e Heroku Toolbelt installati sul tuo computer.
Configurazione:
- Scarica il codice dal repository di ScaleGrid.
- Esegui npm install per installare i componenti necessari.
- Infine, puoi avviare il server del nodo eseguendo "node index.js". Puoi anche eseguire "nodemon" che controlla anche le modifiche ai file.
Puoi anche accedere a una versione ospitata di questa app qui.
La nostra applicazione utilizza una porta di Resque chiamata node-resque che ci consente di controllare le code, i lavoratori e i lavori in esecuzione su un cluster Redis.
Capire le basi
Non appena avvii l'app, devi inserire le credenziali del tuo cluster Redis. Tieni presente che devi avere Resque installato e in esecuzione sul tuo cluster affinché funzioni correttamente.
Fortunatamente, ScaleGrid per Redis™* completamente gestito fornisce una soluzione di hosting ad alte prestazioni con un clic per Redis™. Se non sei già un membro, puoi registrarti per una prova gratuita di 30 giorni qui per iniziare.
Altrimenti, accedi alla tua dashboard e crea un nuovo cluster Redis™ nella sezione Redis™. Una volta che il tuo cluster è attivo e funzionante, puoi raccogliere i dettagli necessari dalla pagina dei dettagli del cluster. Avrai bisogno delle seguenti informazioni:
- Ospite
- Porto
- Password
Se la connessione ha esito positivo, dovresti visualizzare grafici come i seguenti:
Discutiamo ciascuno di questi grafici in dettaglio. Tieni presente che tutti i grafici si aggiornano automaticamente, quindi se i lavoratori stanno elaborando lavori nel tuo cluster, i grafici si aggiorneranno automaticamente.
Attività totali su tutte le code
I grafici sopra mostrano il numero totale di code Resque sul tuo cluster e il numero di lavori contenuti in ciascuna coda. Resque archivia una coda di lavoro in un elenco Redis denominato "resque:queue:name" e ogni elemento nell'elenco è un hash serializzato come stringa JSON. Redis ha anche proprie strutture di gestione, inclusa una lista di lavori "falliti". Resque inserisce i suoi dati all'interno di Redis con il prefisso "resque:", in modo che possano essere condivisi con altri utenti.
Istogramma lavoratore/lavori
Un lavoratore Resque elabora i lavori. Sulle piattaforme che supportano fork(2), il lavoratore sborserà un figlio per elaborare ogni lavoro. Ciò garantisce una tabula rasa all'inizio del lavoro successivo e riduce la crescita graduale della memoria e gli errori di basso livello.
Garantisce inoltre che i lavoratori ascoltino sempre i segnali da te, il loro padrone, e possano reagire di conseguenza.
Il grafico sopra mostra tutti i lavoratori del cluster Redis. Lo stato 1 indica che un lavoro è stato assegnato al lavoratore ed è in corso, mentre lo stato 0 indica che il lavoratore è libero/inattivo.
Stato del lavoro
Un lavoro Resque rappresenta un'unità di lavoro. Ogni lavoro risiede su una singola coda e ha un oggetto payload associato. Il payload è un hash con due attributi:`class` e `args`. La `classe` è il nome della classe Ruby che dovrebbe essere usata per eseguire il lavoro. Gli `args` sono un array di argomenti che dovrebbero essere passati al metodo a livello di classe `perform` della classe Ruby.
Il grafico sopra mostra lo stato dei lavori come elaborati o non riusciti. Un lavoro viene aggiunto allo stato non riuscito se il lavoratore non è riuscito a eseguirlo. Ecco un esempio di un semplice oggetto Jobs.
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); }, }, };
- Qui è disponibile una versione in hosting.
- Per distribuire questa applicazione su Heroku, dai un'occhiata ai loro documenti.
- L'intero codice sorgente è disponibile anche su GitHub per il fork e il lavoro qui.
Come sempre, se costruisci qualcosa di fantastico, scrivici un tweet su @scalegridio.