Criando uma rake task como serviço

Henrique Breim
3 min readAug 9, 2018

Nos últimos dois anos venho trabalhando apenas com APIs e micro serviços na Chiligum, com o objetivo de gerar vídeos customizados únicos para cada pessoa. Como no exemplo abaixo:

Neste case geramos uma campanha do dia dos pais para a MaxMilhas. Onde os seus clientes entravam em um site e preenchiam algumas informações como idade, nomes, fotos e textos. A landing page que a MaxMilhas construiu envia para nossa API as informação preenchidas pelos usuários onde fazemos a mágica para gerar os vídeos.

Ao receber a solicitação da criação de vídeos precisamos gerenciar a quantidade de servidores e efetuar a distribuição através de uma rake task.
Encontrei alguns problemas ao utilizar o foreman para deixa-lo em daemon no Ubuntu 16.04. Como alternativa utilizei o systemd para criar um serviço e ter um pooling que fica rodando 24h por dia realizando a distribuição de vídeos para cada servidor.

Para demonstrar como você pode fazer isso em seus projetos vamos criar uma rake task que pega o preço do bitcoin na api da CoinDesk e alimenta via WebSockets uma view exibindo o preço atual da cotação.

Vamos começar gerando uma nova aplicação:

rails new btc_price_example

Logo em seguida podemos adicionar a gem 'redis', '~> 3.0' ao nosso Gemfile da aplicação e rodar o comando bundle install

Também temos que configurar o nosso adaptador do WebSockets para funcionar com o redis.
Vamos editar o arquivo btc_price_example/config/cable.yml substituindo todo o seu conteúdo por este abaixo:

Nossa task fica localizada em btc_price_example/lib/tasks/btc.rake

Agora temos que criar uma view para a informação ser exibida na tela do usuário, vamos gerar um controller e uma view com o comando:

rails g controller pages index

Também adicionei essa rota como a principal da minha aplicação adicionando a linha root "pages#index" no routes.rb

Vamos adicionar algumas linhas de html no arquivo da views para exibirmos a informação para os usuários em btc_price_example/app/views/pages/index.html.erb

Precisamos alimentar essa view criando um canal de WebSockets para isso vamos precisar adicionar um controller e adicionar algumas linhas de javascript para inserir a informação na view.

Crie o seguinte arquivo btc_price_example/app/channels/web_notifications_channel.rb

Não podemos esquecer de criar o arquivos pages.js dentro da pasta assets e verifique se ele está incluído no seu pipeline do applicantion.js

PRONTO! com nossa app montadinha vamos falar de como automatizar essa rake task!

Dentro da sua máquina com Ubuntu vamos criar um arquivo chamado btc.service. Você deve tomar um extremo cuidado na configuração das pastas de onde estão localizados as apps em seu servidor, caso informe o caminho da pasta errada o paranauê não vai dar certo.
Vamos abrir o nano para criar o btc.service

sudo nano /etc/systemd/system/btc.service

E em seu conteúdo configure exatamente onde estão localizadas suas pastas e também para seu comando rake! Veja o nosso exemplo:

Note que estou realizando isso no ambiente de production e caso você esteja em development basta tirar o RAILS_ENV=production

Ok Ok Okay! com nosso service adicionando, vamos informar para o sistema operacional que temos um novo jogador em campo. Para isso temos alguns comandos interessantes listados abaixo:

ps: caso tenha algum problema rode o comando com sudo na frente.

Rode o comando enable para habilitar o serviço dentro do sistema operacional:

systemctl enable btc.service

E o comando start para iniciar a execução do serviço (rake).

systemctl start btc.service

Se formos olhar nossa view devemos ter um resultado marromenos assim:

Não podemos se esquecer do comando para parar o serviço:

systemctl stop btc.service

Temos também o comando para reiniciar os serviços e o para checar o status do serviço

systemctl daemon-reload

Respectivamente

systemctl status btc.service
Isso é tudo pessoal :)

--

--