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
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 %>
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:
e você pode expirar usando o método "expire_fragment", assim:
expire_fragment(:controller => 'products', :action => 'recent', :action_suffix => 'all_products')
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 %>
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')
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
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"
}
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)