DEV Community

Abraão Carvalho
Abraão Carvalho

Posted on

Desempenho e Otimização em Ruby on Rails

Desempenho e otimização em aplicações Ruby on Rails são temas cruciais para garantir uma experiência rápida e eficiente para os usuários. Isso envolve diversas técnicas, desde caching até ajustes de configuração e escalabilidade.

Caching

Armazena o HTML gerado das páginas em cache para servir rapidamente para os usuários subsequentes, evitando a necessidade de processar a requisição novamente. Obviamente, isso é super rápido. Infelizmente, não pode ser aplicado a todas as situações (como páginas que precisam de autenticação) e como o servidor web está literalmente apenas servindo um arquivo do sistema de arquivos, a expiração do cache é um problema que precisa ser resolvido.

Para habilitar o cache de páginas, você precisa usar o método "caches_page".

class ProductsController < ActionController

  caches_page :index

  def index
    @products = Products.all
  end
end
Enter fullscreen mode Exit fullscreen mode

Fragment Caching

Cacheia partes específicas das páginas, como pedaços de HTML, para reduzir o tempo de renderização. Por exemplo, se você quiser mostrar todos os pedidos feitos em seu site em tempo real e não quiser armazenar em cache aquela parte da página, mas quiser armazenar em cache a parte da página que lista todos os produtos disponíveis, você poderia use este trecho de código:

<% Order.find_recent.each do |o| %>
  <%= o.buyer.name %> bought <%= o.product.name %>
<% end %>

<% cache do %>
  All available products:
  <% Product.all.each do |p| %>
    <%= link_to p.name, product_url(p) %>
  <% end %>
<% end %>
Enter fullscreen mode Exit fullscreen mode

O bloco de cache em nosso exemplo será vinculado à ação que o chamou e será gravado no mesmo local que o Action Cache, o que significa que se você quiser armazenar em cache vários fragmentos por ação, deverá fornecer um "action_suffix" para a chamada de cache:

% cache(:action => 'recent', :action_suffix => 'all_products') do %>
  All available products:
Enter fullscreen mode Exit fullscreen mode

e você pode expirar usando o método "expire_fragment", assim:

expire_fragment(:controller => 'products', :action => 'recent', :action_suffix => 'all_products')
Enter fullscreen mode Exit fullscreen mode

Se você não deseja que o bloco de cache seja vinculado à ação que o chamou, você também pode usar fragmentos com chave global chamando o método de cache com uma chave, da seguinte forma:

<% cache('all_available_products') do %>
  All available products:
<% end %>
Enter fullscreen mode Exit fullscreen mode

Este fragmento fica então disponível para todas as ações no ProductsController usando a chave e pode expirar da mesma maneira:

expire_fragment('all_available_products')
Enter fullscreen mode Exit fullscreen mode

Escalabilidade

Otimização de consultas SQL, uso de índices e sharding para distribuir dados em múltiplos bancos é um recurso do Rails que armazena em cache o conjunto de resultados retornado por cada consulta para que se o Rails encontrar a mesma consulta novamente para aquela solicitação, ele usará o conjunto de resultados em cache ao invés de executar a consulta no banco de dados novamente. Por exemplo:

class ProductsController < ActionController

  def index
    # Run a find query
    @products = Product.all

    ...

    # Run the same query again
    @products = Product.all
  end

end
Enter fullscreen mode Exit fullscreen mode

Na segunda vez que a mesma consulta for executada no banco de dados, ela não atingirá o banco de dados. Na primeira vez que o resultado da consulta é retornado, ele é armazenado no cache da consulta (na memória) e na segunda vez é extraído da memória.

Servidores de Aplicação

Utilização de balanceadores de carga e escalonamento horizontal para lidar com aumento de tráfego.

Exemplo: Configuração de servidores de aplicação como Puma ou Unicorn para balanceamento de carga.

Cache Distribuído

Utilização de cache distribuído para compartilhar dados em servidores múltiplos.

Exemplo: Utilizando Redis como cache compartilhado entre instâncias de aplicação.

# Configuração do Redis para cache distribuído em config/initializers/cache.rb
Rails.application.config.cache_store = :redis_store, {
  host: "localhost",
  port: 6379,
  db: 0,
  namespace: "app_cache"
}
Enter fullscreen mode Exit fullscreen mode

Ajustes de Configuração

Configurações de Ambiente: Ajustes específicos para diferentes ambientes (desenvolvimento, produção, teste) para otimizar o desempenho em cada fase do ciclo de vida da aplicação.

Exemplo: Configuração de diferentes bancos de dados para ambiente de teste e produção.

Tunning do Servidor

Ajustes de configuração do servidor web e banco de dados para melhor desempenho.

Exemplo: Configuração do número máximo de conexões simultâneas no servidor web.

Conclusão

Em resumo, otimizar o desempenho de aplicações Ruby on Rails envolve uma combinação de caching inteligente, escalabilidade eficiente e ajustes precisos de configuração. Essas práticas garantem que a aplicação possa lidar com grandes volumes de tráfego de forma rápida e responsiva, proporcionando uma melhor experiência para os usuários.

Essas são apenas alguns exemplos de como as técnicas de desempenho e otimização podem ser aplicadas em cenários do mundo real em aplicações Ruby on Rails.

Top comments (0)