Docs Menu
Docs Home
/ /

Configurar un servidor forking

En esta guía, puedes aprender a configurar tu aplicación para utilizar un servidor web con bifurcaciones.

Cuando utilices Mongoid con un servidor web que utiliza procesos de fork, sigue las siguientes directrices:

  • Si es posible, no realice ninguna operación de MongoDB en el proceso principal antes de bifurcar.

  • Puedes evitar errores de conexión tales como Mongo::Error::SocketError y Mongo::Error::NoServerAvailable al realizar las siguientes acciones:

    1. Desconecta los clientes de MongoDB en el proceso principal de Ruby inmediatamente antes de bifurcar usando el método Mongoid.disconnect_clients. Esto garantiza que los procesos padre e hijo no reutilicen accidentalmente los mismos sockets y se produzcan conflictos de E/S. Mongoid.disconnect_clients no interrumpe ninguna operación en curso de MongoDB y se vuelve a conectar automáticamente cuando se realizan nuevas operaciones.

    2. Reconecta tus clientes de MongoDB en el subproceso Ruby inmediatamente después de la bifurcación utilizando el método Mongoid.reconnect_clients. Esto es necesario para reaparecer los subprocesos de supervisión del driver en el proceso hijo.

La mayoría de los servidores web proporcionan ganchos que su aplicación puede utilizar para realizar acciones cuando los procesos de trabajo están bifurcados. Las siguientes secciones proporcionan ejemplos de configuración para algunos servidores web Ruby comunes.

Seleccione la pestaña que corresponde a su versión de Puma:

Utiliza el on_worker_boot hook para reconectar los clientes en los procesos worker. Utiliza los hooks before_fork y on_refork para cerrar clientes en el proceso padre.

El siguiente código utiliza los hooks on_worker_boot, before_fork y on_refork en un archivo de configuración de muestra de Puma:

config/puma.rb
# 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 worker processes.
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

Utiliza el before_worker_boot hook para reconectar los clientes en los procesos worker. Utiliza los hooks before_fork y before_refork para cerrar los clientes en el proceso padre. Para aprender más sobre estos hooks, consulta Ganchos de modo clúster en la documentación de la API de Puma.

El siguiente código utiliza los hooks before_worker_boot, before_fork y before_refork en un archivo de configuración de muestra de Puma:

config/puma.rb
# 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 worker processes.
before_refork do
Mongoid.disconnect_clients
end
# Runs in each Puma child process after it forks from its parent.
before_worker_boot do
Mongoid.reconnect_clients
end

Utilice el hook before_fork para cerrar los clientes en el proceso principal. Utiliza la función after_fork para reconectar a los clientes en los procesos de trabajo. Para obtener más información sobre estos ganchos, consulte Configurador en la documentación de la API de Unicorn.

El siguiente código utiliza los hooks before_fork y after_fork en un archivo de configuración de Unicorn de muestra:

config/unicorn.rb
before_fork do |_server, _worker|
Mongoid.disconnect_clients
end
after_fork do |_server, _worker|
Mongoid.reconnect_clients
end

Utiliza el gancho starting_worker_process para volver a conectar clientes en los procesos de los trabajadores. Para obtener más información sobre este gancho, consulta Ganchos de creación inteligente en la documentación de Passenger.

Nota

Passenger tiene un gancho que se invoca en el proceso principal antes de que los procesos de los trabajadores se bifurquen.

El siguiente código utiliza el gancho starting_worker_process para reconectar clientes:

if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
Mongoid.reconnect_clients if forked
end
end

Volver

Conectar

En esta página