Visão geral
Neste guia, você pode aprender sobre como configurar seu aplicação para usar um servidor web de bifurcação.
Ao usar o Mongoid com um servidor web de bifurcação, siga as seguintes diretrizes:
Se possível, não realize nenhuma operação MongoDB no processo principal antes de forjar.
Você pode evitar erros de conexão, como
Mongo::Error::SocketErroreMongo::Error::NoServerAvailableexecutando as seguintes ações:Desconecte os clientes MongoDB no processo Ruby pai imediatamente antes da bifurcação usando o
Mongoid.disconnect_clientsmétodo. Isso garante que os processos pai e filho não reutilizem acidentalmente os mesmos soquetes e tenham conflitos de E/S. OMongoid.disconnect_clientsnão interrompe nenhuma operação do MongoDB a bordo e se reconecta automaticamente quando você executa novas operações.Reconecte seus clientes MongoDB no processo Ruby filho imediatamente após a bifurcação usando o
Mongoid.reconnect_clientsmétodo. Isso é necessário para reiniciar os threads de monitoramento do driver no processo filho.
A maioria dos servidores web fornece hooks que seu aplicação pode usar para executar ações quando os processos de trabalho são bifurcados. As seções a seguir fornecem exemplos de configuração para alguns servidores web Ruby comuns.
Puma
Use o hook de on_worker_boot para reconectar clientes nos funcionários. Use os hooks before_fork e on_refork para fechar clientes no processo pai. Para saber mais sobre esses hooks,consulte Hooks de modo clusterizado na documentação da API do Puma.
O código a seguir usa os ganchos on_worker_boot, before_fork e on_refork em um arquivo de configuração de exemplo do Puma:
# Runs in the Puma master process before it forks a child worker. before_fork do Mongoid.disconnect_clients end # Required when using Puma's fork_worker option. Runs in the # child worker 0 process before it forks grandchild workers. on_refork do Mongoid.disconnect_clients end # Runs in each Puma child process after it forks from its parent. on_worker_boot do Mongoid.reconnect_clients end
Unicórnio
Use o hook de before_fork para fechar clientes no processo principal. Use o hook after_fork para reconectar clientes nos funcionários. Para saber mais sobre esses hooks, consulte Configurator na documentação da API do Unicorn.
O código a seguir usa os ganchos before_fork e after_fork em um arquivo de configuração de exemplo do Unicorn:
before_fork do |_server, _worker| Mongoid.disconnect_clients end after_fork do |_server, _worker| Mongoid.reconnect_clients end
Passageiro(a)
Use o hook de starting_worker_process para reconectar clientes nos funcionários. Para saber mais sobre esse gancho, consulte Gatilhos de criação inteligentes na documentação do Passageiro.
Observação
O Passageiro tem um hook que é invocado no processo principal antes da bifurcação dos funcionários.
O seguinte código utiliza o hook starting_worker_process para reconectar clientes:
if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| Mongoid.reconnect_clients if forked end end