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.
Puedes evitar errores de conexión tales como
Mongo::Error::SocketErroryMongo::Error::NoServerAvailableal realizar las siguientes acciones: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_clientsno interrumpe ninguna operación en curso de MongoDB y se vuelve a conectar automáticamente cuando se realizan 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 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.
Puma
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:
# 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:
# 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 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