Sempre quis visualizar como suas filas, trabalhadores e trabalhos da Resque estão indo? Neste artigo, vamos aprender como construir alguns gráficos simples em torno dos componentes Resque.
Delegando jobs a uma fila em segundo plano
A delegação de trabalhos de longa duração, computacionalmente caros e de alta latência para uma fila de trabalho em segundo plano é um padrão comum usado para criar aplicativos da Web escaláveis. O objetivo é atender às solicitações do usuário final com a resposta mais rápida possível, garantindo que todos os trabalhos caros sejam tratados fora do ciclo de solicitação/resposta.
Resque
Resque é uma biblioteca Ruby com suporte do Redis para criar jobs em segundo plano, colocá-los em várias filas e processá-los posteriormente. Ele foi projetado para uso em cenários que exigem um grande volume de entradas de trabalho, pois a Resque fornece mecanismos para garantir visibilidade e confiabilidade do comportamento enquanto retransmite estatísticas por meio de um painel da Web.
Redis
O Redis é um armazenamento de estrutura de dados na memória de código aberto (licenciado BSD), usado como banco de dados, cache e agente de mensagens. Ele suporta estruturas de dados como strings, hashes, listas, conjuntos, conjuntos classificados com consultas de intervalo, bitmaps, hiperloglogs e índices geoespaciais com consultas de raio.
Node.js
O Node.js é uma plataforma criada no tempo de execução JavaScript do Chrome para criar facilmente aplicativos de rede rápidos e escalonáveis. O Node.js usa um modelo de E/S sem bloqueio e orientado a eventos que o torna leve e eficiente e, portanto, perfeito para aplicativos em tempo real com uso intenso de dados executados em dispositivos distribuídos.
Express.js
Express.js é uma estrutura Node.js. O Node.js é uma plataforma que permite que o JavaScript seja usado fora dos navegadores da Web, para criar aplicativos da Web e de rede. Isso significa que você pode criar o servidor e o código do lado do servidor para um aplicativo como a maioria das outras linguagens da Web, mas usando JavaScript.
Socket.IO
Socket.IO é uma biblioteca JavaScript para aplicativos da Web em tempo real. Ele permite a comunicação bidirecional em tempo real entre clientes e servidores da Web. Ele tem duas partes:uma biblioteca do lado do cliente que é executada no navegador e uma biblioteca do lado do servidor para Node.js. Ambos os componentes têm APIs quase idênticas.
Heroku
Heroku é uma plataforma em nuvem que permite que as empresas criem, entreguem, monitorem e dimensionem aplicativos — é a maneira mais rápida de passar da ideia à URL, ignorando todas essas dores de cabeça de infraestrutura.
Este artigo pressupõe que você já tenha o Redis, Node.js e o Heroku Toolbelt instalados em sua máquina.
Configuração:
- Baixe o código do repositório do ScaleGrid.
- Execute npm install para instalar os componentes necessários.
- Finalmente, você pode iniciar o servidor do nó fazendo “node index.js”. Você também pode executar o "nodemon", que também observa as alterações nos arquivos.
Você também pode acessar uma versão hospedada deste aplicativo aqui.
Nosso aplicativo usa uma porta de Resque chamada node-resque que nos permite observar filas, trabalhadores e trabalhos em execução em um cluster Redis.
Compreendendo o básico
Assim que você iniciar o aplicativo, será necessário inserir as credenciais do cluster Redis. Observe que você deve ter o Resque instalado e em execução em seu cluster para que isso funcione corretamente.
Felizmente, o ScaleGrid for Redis™* totalmente gerenciado oferece uma solução de hospedagem de alto desempenho com um clique para Redis™. Se você ainda não é membro, inscreva-se para uma avaliação gratuita de 30 dias aqui para começar.
Caso contrário, faça login em seu painel e crie um novo cluster Redis™ na seção Redis™. Assim que o cluster estiver funcionando, você poderá obter os detalhes necessários na Página de detalhes do cluster. Você vai precisar das seguintes informações:
- Anfitrião
- Porta
- Senha
Se a conexão for bem-sucedida, você deverá ver gráficos como os seguintes:
Vamos discutir cada um desses gráficos em detalhes. Observe que todos os gráficos são autoatualizáveis. Portanto, se os trabalhadores estiverem processando jobs no cluster, os gráficos serão atualizados automaticamente.
Total de tarefas em todas as filas
Os gráficos acima mostram o número total de filas Resque em seu cluster e o número de trabalhos contidos em cada fila. Resque armazena uma fila de trabalhos em uma lista Redis chamada “resque:queue:name”, e cada elemento na lista é um hash serializado como uma string JSON. O Redis também possui suas próprias estruturas de gerenciamento, incluindo uma lista de tarefas “falhou”. Resque nomeia seus dados no Redis com o prefixo “resque:”, para que possam ser compartilhados com outros usuários.
Histograma de trabalhadores/trabalhos
Um trabalhador da Resque processa jobs. Em plataformas que suportam fork(2), o trabalhador irá desvincular um filho para processar cada trabalho. Isso garante uma ardósia limpa ao iniciar o próximo trabalho e reduz o crescimento gradual da memória, bem como falhas de baixo nível.
Também garante que os trabalhadores estejam sempre ouvindo os sinais de você, seu mestre, e possam reagir de acordo.
O gráfico acima mostra todos os trabalhadores no cluster Redis. Um estado de 1 indica que um trabalho foi atribuído ao trabalhador e está em andamento, e um estado de 0 indica que o trabalhador está livre/ocioso.
Status do trabalho
Um trabalho de Resque representa uma unidade de trabalho. Cada trabalho reside em uma única fila e possui um objeto de carga útil associado. A carga útil é um hash com dois atributos:`class` e `args`. A `class` é o nome da classe Ruby que deve ser usada para executar o trabalho. Os `args` são um array de argumentos que devem ser passados para o método de nível de classe `perform` da classe Ruby.
O gráfico acima mostra o status dos trabalhos como processados ou com falha. Um trabalho é adicionado ao estado de falha se o trabalhador não conseguir executá-lo. Aqui está um exemplo de um objeto Jobs simples.
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); }, }, };
- Uma versão hospedada está disponível aqui.
- Para implantar este aplicativo no Heroku, confira seus documentos.
- Todo o código-fonte também está disponível no GitHub para você bifurcar e trabalhar aqui.
Como sempre, se você construir algo incrível, envie-nos um tweet sobre isso @scalegridio.