Ao desenvolver um aplicativo Ruby on Rails, você pode se deparar com tarefas de aplicativos que devem ser executadas de maneira assíncrona. O processamento de dados, envio de e-mails em lote, ou a interação com APIs externas são todos exemplos de trabalho que podem ser feitos de maneira assíncrona com o background jobs. O uso de jobs em segundo plano pode melhorar o desempenho de seu aplicativo, descarregando tarefas potencialmente demoradas em uma fila de processamento em segundo plano, liberando o ciclo de solicitação/resposta original.
O Sidekiq é uma das frameworks mais amplamente utilizadas em jobs de segundo plano que você pode implementar em um aplicativo Rails. Ele é apoiado pelo Redis, um armazenamento de valores-chave dentro da memória conhecido pela sua flexibilidade e desempenho. O Sidekiq utiliza o Redis como um armazenamento de gerenciamento de tarefas para processar milhares de tarefas por segundo.
Neste tutorial, você adicionará o Redis e o Sidekiq a um aplicativo existente do Rails. Você criará um conjunto de classes e métodos de trabalho do Sidekiq para lidar com:
Quando terminar, terá um aplicativo de demonstração que utilizará trabalhadores e trabalhos para processar tarefas de maneira assíncrona. Esta será uma boa base para que você adicione trabalhadores e trabalhos ao seu próprio aplicativo, usando este tutorial como um ponto de partida.
Para seguir este tutorial, você vai precisar do seguinte:
ufw
. Para mais instruções sobre como configurar isso, consulte nosso tutorial de Configuração inicial de servidor com o Ubuntu 18.04.Nosso primeiro passo será clonar o repositório de rails-bootstrap da conta do GitHub da Comunidade da DigitalOcean. Esse repositório inclui o código da configuração descrita em Como adicionar o Bootstrap em um aplicativo Ruby on Rails, que explica como adicionar o Bootstrap a um projeto Rails 5 existente.
Clone o repositório em um diretório chamado rails-sidekiq
:
- git clone https://github.com/do-community/rails-bootstrap.git rails-sidekiq
Navegue até o diretório rails-sidekiq
:
- cd rails-sidekiq
Para trabalhar com o código, primeiro será necessário instalar as dependências do projeto, que estão listadas em seu Gemfile. Você também precisará adicionar o sidekiq gem ao projeto para trabalhar com o Sidekiq e o Redis.
Abra o Gemfile do projeto para editá-lo usando o nano
ou seu editor favorito:
- nano Gemfile
Adicione a gem em qualquer lugar das dependências principais do projeto (acima das dependências de desenvolvimento):
. . .
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false
gem 'sidekiq', '~>6.0.0'
group :development, :test do
. . .
Salve e feche o arquivo quando terminar de adicionar o gem.
Use o seguinte comando para instalar os gems:
- bundle install
Você verá na saída que o redis
gem também está instalado como um requisito para o sidekiq
.
Em seguida, você instalará suas dependências do Yarn. Como esse projeto Rails 5 foi modificado para atender ativos com o webpack, as dependências de JavaScript dele são gerenciadas agora pelo Yarn. Isso significa que é necessário instalar e verificar as dependências listadas no arquivo do projeto package.json
.
Execute o yarn install
para instalar essas dependências:
- yarn install
Em seguida, execute seu banco de dados de migrações:
- rails db:migrate
Assim que suas migrações terminarem, teste o aplicativo para garantir que ele esteja funcionando como esperado. Caso esteja trabalhando localmente, inicie seu servidor no contexto do seu pacote local com o seguinte comando:
- bundle exec rails s
Caso esteja trabalhando em um servidor de desenvolvimento, inicie o aplicativo com:
- bundle exec rails s --binding=your_server_ip
Navegue até o localhost:3000
ou http://your_server_ip:3000
. Você verá a seguinte página inicial:
Para criar um novo tubarão, clique no botão Get Shark Info, que levará você até a rota sharks/index
:
Para verificar se o aplicativo está funcionando, podemos adicionar algumas informações de demonstração a ele. Clique em New Shark. Será solicitado que coloque um nome de usuário (sammy) e senha (shark), graças às configurações de autenticação do projeto.
Na página New Shark, digite “Great White” no campo Name e “Scary” no campo Facts.
Clique no botão Create Shark para criar o tubarão. Assim que ver que seu tubarão foi criado, encerre o servidor com CTRL+C
.
Você instalou as dependências necessárias para seu projeto e testou sua funcionalidade. Em seguida, você pode fazer algumas alterações no aplicativo Rails para trabalhar com seus recursos de tubarões ameaçados de extinção.
Para trabalhar com nossos recursos de tubarões ameaçados de extinção, adicionaremos um novo modelo ao aplicativo e um controlador que controlará como as informações sobre tubarões ameaçados de extinção serão apresentadas aos usuários. Nosso objetivo final é tornar possível que os usuários enviem um lote grande de informações sobre tubarões ameaçados de extinção sem bloquear a funcionalidade geral do nosso aplicativo e excluírem essas informações quando não precisarem mais delas.
Primeiro, vamos criar um modelo Endangered
para nossos tubarões ameaçados de extinção. Vamos incluir um campo string em nossa tabela de banco de dados para o nome do tubarão e outro campo string para as categorias da União Internacional para a Conservação da Natureza (IUCN), que determina o grau em que cada tubarão está em risco.
Por fim, nossa estrutura de modelo corresponderá às colunas do arquivo CSV que usaremos para criar nosso upload do lote. Este arquivo está localizado no diretório db
e você pode verificar seu conteúdo com o seguinte comando:
- cat db/sharks.csv
O arquivo contém uma lista de 73 tubarões ameaçados de extinção e seus status de IUCN - vu para vulneráveis, en para ameaçados de extinção e cr para criticamente ameaçados de extinção.
Nosso modelo Endangered
se correlacionará com esses dados, permitindo-nos criar novas instâncias de Endangered
a partir deste arquivo CSV. Crie o modelo com o seguinte comando:
- rails generate model Endangered name:string iucn:string
Em seguida, gere um controlador Endangered
com uma ação index
:
- rails generate controller endangered index
Isso nos dará um ponto de partida para desenvolver a funcionalidade do nosso aplicativo, embora também seja necessário adicionar métodos personalizados ao arquivo do controlador que o Rails gerou para nós.
Abra aquele arquivo agora:
- nano app/controllers/endangered_controller.rb
O Rails nos forneceu um rascunho que podemos começar a preencher.
Primeiro, vamos precisar determinar quais rotas precisamos trabalhar com nossos dados. Graças ao comando generate controller
, temos um método index
para começar. Isso se correlacionará a uma visualização do index
, onde apresentaremos usuários com a opção de fazer o upload de tubarões ameaçados de extinção.
No entanto, também queremos lidar com casos onde os usuários podem já ter feito upload dos tubarões; eles não precisarão de uma opção de upload neste caso. De algum modo precisaremos avaliar quantas instâncias da classe Endangered
já existem, uma vez que mais de uma indica que o upload do lote já ocorreu.
Vamos começar criando um método privado
set_endangered
que capturará cada instância de nossa classe Endangered
a partir do banco de dados. Adicione o código a seguir ao arquivo:
class EndangeredController < ApplicationController
before_action :set_endangered, only: [:index, :data]
def index
end
private
def set_endangered
@endangered = Endangered.all
end
end
Note que o filtro before_action
garantirá que o valor @endangered
seja definido apenas para as rotas index
e data
, que serão as rotas onde lidaremos com os dados dos tubarões ameaçados de extinção.
Em seguida, adicione o seguinte código ao método index
para determinar a rota correta para usuários visitando esta parte do aplicativo:
class EndangeredController < ApplicationController
before_action :set_endangered, only: [:index, :data]
def index
if @endangered.length > 0
redirect_to endangered_data_path
else
render 'index'
end
end
. . .
Caso não exista nenhuma instância de nossa classe Endangered
, redirecionaremos os usuários para a rota data
, onde podem visualizar informações sobre os tubarões que eles criaram. Caso contrário, eles visualizarão o index
.
Em seguida, abaixo do método index
, adicione um método data
, que se correlacionará a uma visualização do método data
:
. . .
def index
if @endangered.length > 0
redirect_to endangered_data_path
else
render 'index'
end
end
def data
end
. . .
Em seguida, adicionaremos um método para lidar com o upload de dados propriamente dito. Vamos chamar este método de upload
e chamaremos uma classe trabalhadora e um método Sidekiq para realizar o upload de dados do arquivo CSV. Criaremos a definição para essa classe trabalhadora, AddEndangeredWorker
, no próximo passo.
Por enquanto, adicione o seguinte código ao arquivo para fazer o trabalhador do Sidekiq realizar o upload:
. . .
def data
end
def upload
csv_file = File.join Rails.root, 'db', 'sharks.csv'
AddEndangeredWorker.perform_async(csv_file)
redirect_to endangered_data_path, notice: 'Endangered sharks have been uploaded!'
end
. . .
Ao chamar o método perform_async
da classe AddEndangeredWorker
usando o arquivo CSV como um argumento, este código garante que os dados do tubarão e o trabalho de upload sejam passados para o Redis. Os trabalhadores do Sidekiq que vamos configurar monitoram a fila de trabalho e reagirão quando novos trabalhos surgirem.
Após chamar o perform_async
, nosso método de upload
redireciona para o caminho data
, onde os usuários poderão ver os tubarões carregados.
Em seguida, adicionaremos um método destroy
para destruir os dados. Adicione o seguinte código abaixo do método do upload
:
. . .
def upload
csv_file = File.join Rails.root, 'db', 'sharks.csv'
AddEndangeredWorker.perform_async(csv_file)
redirect_to endangered_data_path, notice: 'Endangered sharks have been uploaded!'
end
def destroy
RemoveEndangeredWorker.perform_async
redirect_to root_path
end
. . .
Da mesma forma que nosso método de upload
, nosso método destroy
inclui uma chamada do perform_async
de uma classe RemoveEndangeredWorker
— o outro trabalhador Sidekiq que vamos criar. Após chamar este método, ele redireciona os usuários para o caminho do aplicativo raiz.
O arquivo final se parecerá com este:
class EndangeredController < ApplicationController
before_action :set_endangered, only: [:index, :data]
def index
if @endangered.length > 0
redirect_to endangered_data_path
else
render 'index'
end
end
def data
end
def upload
csv_file = File.join Rails.root, 'db', 'sharks.csv'
AddEndangeredWorker.perform_async(csv_file)
redirect_to endangered_data_path, notice: 'Endangered sharks have been uploaded!'
end
def destroy
RemoveEndangeredWorker.perform_async
redirect_to root_path
end
private
def set_endangered
@endangered = Endangered.all
end
end
Salve e feche o arquivo quando você terminar a edição.
Como passo final na consolidação das rotas do nosso aplicativo, vamos modificar o código em config/routes.rb
, o arquivo onde ficam nossas declarações de rota.
Abra aquele arquivo agora:
- nano config/routes.rb
O arquivo se parece com esse:
Rails.application.routes.draw do
get 'endangered/index'
get 'home/index'
resources :sharks do
resources :posts
end
root 'home#index'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
Vamos precisar atualizar o arquivo para incluir as rotas que definimos em nosso controlador: data
, upload
e destroy
. Nossa rota de data
corresponderá a uma solicitação GET para recuperar os dados do tubarão, enquanto nossas rotas de upload
e destroy
mapearão as solicitações POST, que farão o upload e a destruição desses dados.
Adicione o código a seguir ao arquivo para definir essas rotas:
Rails.application.routes.draw do
get 'endangered/index'
get 'endangered/data', to: 'endangered#data'
post 'endangered/upload', to: 'endangered#upload'
post 'endangered/destroy', to: 'endangered#destroy'
get 'home/index'
resources :sharks do
resources :posts
end
root 'home#index'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
Salve e feche o arquivo quando você terminar a edição.
Com seu modelo e controlador Endangered
em funcionamento, continue para definir suas classes de trabalhadores do Sidekiq.
Chamamos os métodos do perform_async
nos trabalhadores do Sidekiq em nosso controlador, mas ainda precisamos criar os trabalhadores em si.
Primeiro, crie um diretório workers
para os trabalhadores:
- mkdir app/workers
Abra um arquivo para o trabalhador AddEndangeredWorker
:
- nano app/workers/add_endangered_worker.rb
Neste arquivo, adicionaremos códigos que nos permitirá trabalhar com os dados em nosso arquivo CSV. Primeiro, adicione códigos ao arquivo que criarão a classe, inclua a biblioteca Ruby CSV e certifique-se de que essa classe funcione como um trabalhador Sidekiq:
class AddEndangeredWorker
require 'csv'
include Sidekiq::Worker
sidekiq_options retry: false
end
Também incluiremos a opção retry: false
para garantir que o Sidekiq não tente fazer o upload novamente em caso de falha.
Em seguida, adicione o código para a função perform
:
class AddEndangeredWorker
require 'csv'
include Sidekiq::Worker
sidekiq_options retry: false
def perform(csv_file)
CSV.foreach(csv_file, headers: true) do |shark|
Endangered.create(name: shark[0], iucn: shark[1])
end
end
end
O método perform
recebe argumentos do método perform_async
definido no controlador, por este motivo, é importante que os valores do argumento estejam alinhados. Aqui, passamos a csv_file
, a variável que definimos no controlador, e usamos o método foreach
da biblioteca CSV para ler os valores no arquivo. Definir headers: true
para este loop garante que a primeira linha do arquivo seja tratada como uma linha de cabeçalhos.
Então, o bloco lê os valores do arquivo nas colunas que definimos para nosso modelo Endangered
: name
e iucn
. Executar este loop criará instâncias Endangered
para cada uma das entradas em nosso arquivo CSV.
Assim que terminar a edição, salve e feche o arquivo.
Em seguida, criaremos um trabalhador para lidar com a exclusão desses dados. Abra um arquivo para a classe RemoveEndangeredWorker
:
- nano app/workers/remove_endangered_worker.rb
Adicione o código a seguir para definir a classe, e para garantir que ela utilize a biblioteca e as funções CSV como um trabalhador Sidekiq:
class RemoveEndangeredWorker
include Sidekiq::Worker
sidekiq_options retry: false
end
Em seguida, adicione um método perform
para lidar com a destruição dos dados dos tubarões ameaçados de extinção:
class RemoveEndangeredWorker
include Sidekiq::Worker
sidekiq_options retry: false
def perform
Endangered.destroy_all
end
end
O método perform
chama a função destroy_all
na classe Endangered
, que removerá todas as instâncias da classe a partir do banco de dados.
Salve e feche o arquivo quando você terminar a edição.
Com seus trabalhadores em funcionamento, continue para a criação de um layout para suas visualizações de endangered
e a criação de modelos para a visualização de seus index
e data
, de modo que os usuários possam fazer upload e visualizar tubarões ameaçados de extinção.
Para que os usuários aproveitem suas informações de tubarões ameaçados de extinção, precisaremos abordar duas coisas: o layout para as visualizações definidas em nosso controlador endangered
e os modelos de visualização para as visualizações de index
e de data
.
Atualmente, nosso aplicativo utiliza um layout em todo o aplicativo, localizado em app/views/layouts/application.html.erb
, uma navegação parcial e um layout para visualizações de sharks
. O layout do aplicativo verifica se há um bloco de conteúdo que nos permita carregar diferentes layouts com base em qual parte do aplicativo nosso usuário se encontra: para a home
index
, os usuários verão um layout, e para quaisquer visualizações relacionadas a tubarões individuais, eles verão outro layout.
Podemos reaproveitar o layout sharks
para nossas visualizações endangered
, uma vez que este formato também funcionará para a apresentação de dados de tubarões em massa.
Copie o arquivo de layout de sharks
para criar um layout de endangered
:
- cp app/views/layouts/sharks.html.erb app/views/layouts/endangered.html.erb
Em seguida, vamos trabalhar na criação dos modelos de visualização para nossas visualizações de index
e de data
.
Abra o modelo index
primeiro:
- nano app/views/endangered/index.html.erb
Exclua o código boilerplate e adicione o código a seguir, o qual dará informações gerais aos usuários sobre as categorias ameaçados de extinção e os apresentará com a opção de fazer o upload das informações sobre eles:
<p id="notice"><%= notice %></p>
<h1>Endangered Sharks</h1>
<p>International Union for Conservation of Nature (ICUN) statuses: <b>vu:</b> Vulnerable, <b>en:</b> Endangered, <b>cr:</b> Critically Endangered </p>
<br>
<%= form_tag endangered_upload_path do %>
<%= submit_tag "Import Endangered Sharks" %>
<% end %>
<br>
<%= link_to 'New Shark', new_shark_path, :class => "btn btn-primary btn-sm" %> <%= link_to 'Home', home_index_path, :class => "btn btn-primary btn-sm" %>
Uma form_tag
torna o upload de dados possível, apontando uma ação posterior para a endangered_upload_path
— a rota que definimos para nossos uploads. Um botão de enviar, criado com o submit_tag
, solicita que os usuários façam o "Import Endangered Sharks"
.
Além deste código, incluímos algumas informações gerais sobre os códigos ICUN, de modo que os usuários possam interpretar os dados que eles verão.
Salve e feche o arquivo quando você terminar a edição.
Em seguida, abra um arquivo para a visualização de data
:
- nano app/views/endangered/data.html.erb
Adicione o código a seguir, que adicionará uma tabela com os dados de tubarões ameaçados de extinção:
<p id="notice"><%= notice %></p>
<h1>Endangered Sharks</h1>
<p>International Union for Conservation of Nature (ICUN) statuses: <b>vu:</b> Vulnerable, <b>en:</b> Endangered, <b>cr:</b> Critically Endangered </p>
<div class="table-responsive">
<table class="table table-striped table-dark">
<thead>
<tr>
<th>Name</th>
<th>IUCN Status</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @endangered.each do |shark| %>
<tr>
<td><%= shark.name %></td>
<td><%= shark.iucn %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<br>
<%= form_tag endangered_destroy_path do %>
<%= submit_tag "Delete Endangered Sharks" %>
<% end %>
<br>
<%= link_to 'New Shark', new_shark_path, :class => "btn btn-primary btn-sm" %> <%= link_to 'Home', home_index_path, :class => "btn btn-primary btn-sm" %>
Esse código inclui os códigos de status da ICUN novamente e uma tabela de Inicialização para os dados produzidos. Ao fazer loop através de nossa variável @endangered
, produziremos o nome e o status de ICUN de cada tubarão para a tabela.
Abaixo da tabela, temos outro conjunto de form_tags
e de submit_tags
que foram enviados para o caminho destroy
, oferecendo aos usuários a opção "Delete Endangered Sharks"
.
Salve e feche o arquivo quando você terminar a edição.
A última modificação que vamos fazer às visualizações será feita na visualização de index
associada ao nosso controlador home
. Você deve se lembrar de que essa visualização está definida como a raiz do aplicativo em config/routes.rb
.
Abra este arquivo para edição:
- nano app/views/home/index.html.erb
Encontre a coluna na linha que afirma que Sharks are ancient
:
. . .
<div class="col-lg-6">
<h3>Sharks are ancient</h3>
<p>There is evidence to suggest that sharks lived up to 400 million years ago.
</p>
</div>
</div>
</div>
Adicione o código a seguir ao arquivo:
. . .
<div class="col-lg-6">
<h3>Sharks are ancient and SOME are in danger</h3>
<p>There is evidence to suggest that sharks lived up to 400 million years ago. Without our help, some could disappear soon.</p>
<p><%= button_to 'Which Sharks Are in Danger?', endangered_index_path, :method => :get, :class => "btn btn-primary btn-sm"%>
</p>
</div>
</div>
</div>
Incluímos uma chamada de ação para os usuários aprenderem mais sobre os tubarões ameaçados de extinção, primeiramente compartilhando uma mensagem importante e, em seguida, adicionando um auxiliar button_to
que envia uma solicitação GET para nossa rota de endangered
index
, dando acesso a essa parte do aplicativo. A partir daí, eles poderão fazer o upload e visualizar informações sobre tubarões ameaçados de extinção.
Salve e feche o arquivo quando você terminar a edição.
Com seu código funcionando, você está pronto para inicializar o aplicativo e fazer o upload de alguns tubarões!
Antes de inicializar o aplicativo, precisaremos executar as migrações em nosso banco de dados e iniciar o Sidekiq para habilitar nossos trabalhadores. O Redis já deve estar em execução no servidor, mas podemos verificar isso para termos certeza. Com tudo isso funcionando, estaremos prontos para testar o aplicativo.
Primeiro, verifique se o Redis está funcionando:
- systemctl status redis
Deverá ver um resultado como o seguinte:
Output● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-11-12 20:37:13 UTC; 1 weeks 0 days ago
Em seguida, execute seu banco de dados de migrações:
- rails db:migrate
Agora, você pode iniciar o Sidekiq no contexto do seu pacote atual do projeto, usando o comando bundle exec sidekiq
:
- bundle exec sidekiq
Você verá um resultado como este, indicando que o Sidekiq está pronto para processar trabalhos:
Output
m,
`$b
.ss, $$: .,d$
`$$P,d$P' .,md$P"'
,$$$$$b/md$$$P^'
.d$$$$$$/$$$P'
$$^' `"/$$$' ____ _ _ _ _
$: ,$$: / ___|(_) __| | ___| | _(_) __ _
`b :$$ \___ \| |/ _` |/ _ \ |/ / |/ _` |
$$: ___) | | (_| | __/ <| | (_| |
$$ |____/|_|\__,_|\___|_|\_\_|\__, |
.d$$ |_|
2019-11-19T21:43:00.540Z pid=17621 tid=gpiqiesdl INFO: Running in ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
2019-11-19T21:43:00.540Z pid=17621 tid=gpiqiesdl INFO: See LICENSE and the LGPL-3.0 for licensing details.
2019-11-19T21:43:00.540Z pid=17621 tid=gpiqiesdl INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org
2019-11-19T21:43:00.540Z pid=17621 tid=gpiqiesdl INFO: Booting Sidekiq 6.0.3 with redis options {:id=>"Sidekiq-server-PID-17621", :url=>nil}
2019-11-19T21:43:00.543Z pid=17621 tid=gpiqiesdl INFO: Starting processing, hit Ctrl-C to stop
Abra uma segunda janela de terminal, navegue para o diretório rails-sidekiq
e inicialize seu servidor do aplicativo.
Caso esteja executando o aplicativo localmente, use o seguinte comando:
- bundle exec rails s
Caso esteja trabalhando com um servidor de desenvolvimento, execute o seguinte:
- bundle exec rails s --binding=your_server_ip
Navegue para o localhost:3000
ou http://your_server_ip:3000
no navegador. Você verá a seguinte página inicial:
Clique no botão Which Sharks Are in Danger? [Quais tubarões estão em perigo?] . Como não fez upload de nenhum tubarão ameaçado de extinção, isso levará você até a visualização de endangered
index
:
Clique em Import Endangered Sharks para importar os tubarões. Você verá uma mensagem de status informando que os tubarões foram importados:
Você verá também o início da importação. Atualize sua página para ver a tabela inteira:
Graças ao Sidekiq, o upload de nosso lote grande de tubarões em perigo foi bem-sucedido, sem bloquear o navegador ou interferir com outras funcionalidades do aplicativo.
Clique no botão Home, no final da página, para voltar à página principal do aplicativo:
A partir daqui, clique em Which Sharks Are in Danger? novamente. Isso levará você diretamente para a visualização de data
, uma vez que você já fez o upload dos tubarões.
Para testar a funcionalidade de exclusão, clique no botão Delete Endangered Sharks abaixo da tabela. Você deve ser redirecionado para a página inicial do aplicativo novamente. Clicando em Which Sharks Are in Danger? uma última vez levará você de volta para a visualização do index
, onde terá a opção de fazer o upload dos tubarões novamente:
Seu aplicativo agora está funcionando com os trabalhadores Sidekiq, que estão prontos para processar trabalhos e garantir que os usuários tenham uma boa experiência ao trabalhar com seu aplicativo.
Agora, você tem um aplicativo Rails em funcionamento com o Sidekiq habilitado, o que permitirá que você descarregue operações dispendiosas em uma fila de trabalho gerenciada pelo Sidekiq e apoiada pelo Redis. Isso permitirá que você melhore a velocidade e a funcionalidade do seu site à medida que desenvolve.
Caso queira aprender mais sobre o Sidekiq, os docs são um bom lugar para começar.
Para aprender mais sobre o Redis, confira nossa biblioteca dos recursos do Redis. Você também pode aprender mais sobre a execução de um cluster gerenciado do Redis na DigitalOcean, conferindo a documentação do produto.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!