Overview
En esta guía, puedes aprender a configurar tu aplicación para utilizar un servidor web con bifurcaciones.
Al utilizar Mongoid con un servidor web bifurcado, siga las siguientes pautas:
Si es posible, no realice ninguna operación MongoDB en el proceso padre antes de la bifurcación.
Puede evitar errores de conexión como
Mongo::Error::SocketErroryMongo::Error::NoServerAvailablerealizando las siguientes acciones:Desconecte los clientes MongoDB del proceso Ruby padre inmediatamente antes de la bifurcación mediante el
Mongoid.disconnect_clientsmétodo. Esto garantiza que los procesos padre e hijo no reutilicen accidentalmente los mismos sockets ni generen conflictos de E/S.Mongoid.disconnect_clientsno interrumpe ninguna operación MongoDB en curso y se reconecta automáticamente al realizar nuevas operaciones.Reconecta tus clientes MongoDB en el proceso secundario de Ruby inmediatamente después de la bifurcación mediante el
Mongoid.reconnect_clientsmétodo. Esto es necesario para reactivar los hilos de monitorización del controlador en el proceso secundario.
La mayoría de los servidores web proporcionan enlaces que su aplicación puede usar para realizar acciones cuando se bifurcan los procesos de trabajo. Las siguientes secciones ofrecen ejemplos de configuración para algunos servidores web Ruby comunes.
Puma
Selecciona la pestaña que corresponde a tu versión de Puma:
Utilice el enlace on_worker_boot para reconectar clientes en los procesos de trabajo. Utilice los enlaces before_fork y on_refork para cerrar clientes en el proceso principal.
El siguiente código utiliza los ganchos on_worker_boot, before_fork y on_refork en un archivo de configuración de Puma de muestra:
# 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
Utilice el enlace before_worker_boot para reconectar clientes en los procesos de trabajo. Utilice los enlaces before_fork y before_refork para cerrar clientes en el proceso principal. Para obtener más información sobre estos enlaces, consulte Ganchos del modo clúster en la documentación de la API de Puma.
El siguiente código utiliza los ganchos before_worker_boot, before_fork y before_refork en un archivo de configuración de Puma de muestra:
# 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
Unicornio
Utilice el before_fork enlace para cerrar clientes en el proceso principal. Utilice el after_fork enlace para reconectar clientes en los procesos de trabajo. Para obtener más información sobre estos enlaces, consulte el Configurador en la documentación de la API de Unicorn.
El siguiente código utiliza los ganchos before_fork y after_fork en un archivo de configuración de Unicorn de muestra:
before_fork do |_server, _worker| Mongoid.disconnect_clients end after_fork do |_server, _worker| Mongoid.reconnect_clients end
Pasajero
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 padre antes de que se bifurquen los procesos de trabajo.
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