Overview
在本指南中,您可以学习;了解如何配置应用程序以使用分叉 Web服务器。
将 Mongoid 与分叉 Web服务器一起使用时,请遵循以下准则:
如果可能,在 fork 之前不要在父进程中执行任何MongoDB操作。
您可以通过执行以下操作来避免
Mongo::Error::SocketError
和Mongo::Error::NoServerAvailable
等连接错误:使用 方法在派生之前立即断开父Ruby进程中MongoDB客户端的连接。
Mongoid.disconnect_clients
这可确保父进程和子进程不会意外重复使用相同的套接字并发生 I/O 冲突。Mongoid.disconnect_clients
不会中断任何正在进行的MongoDB操作,并在您执行新操作时自动重新连接。在分叉后,立即使用 方法重新连接Ruby子进程中的MongoDB客户端。
Mongoid.reconnect_clients
这是在子进程中重新生成驱动程序的监控线程所必需的。
大多数 Web 服务器都提供钩子,应用程序可以使用这些钩子在工作进程分叉时执行操作。 以下部分提供了一些常见Ruby Web 服务器的配置示例。
Puma
使用on_worker_boot
钩子重新连接工作线程中的客户端。使用before_fork
和on_refork
钩子关闭父进程中的客户端。要学习;了解有关这些钩子的更多信息,请参阅 Puma API文档中的 集群模式钩子 。
以下代码使用示例Puma 配置文件中的 on_worker_boot
、before_fork
和 on_refork
钩子:
# 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
Unicorn
使用 before_fork
钩子关闭父进程中的客户端。 使用 after_fork
钩子重新连接工作线程中的客户端。 要学习;了解有关这些钩子的更多信息,请参阅 Unicorn API文档中的配置器。
以下代码使用示例Unicorn 配置文件中的 before_fork
和 after_fork
钩子:
before_fork do |_server, _worker| Mongoid.disconnect_clients end after_fork do |_server, _worker| Mongoid.reconnect_clients end
Passenger
使用 starting_worker_process
钩子重新连接工作线程中的客户端。 要学习;了解有关此钩子的更多信息,请参阅 Passenger 文档中的智能生成钩子。
注意
Passenger 确实有一个钩子,在工作线程被分叉之前,该钩子会在父进程中被调用。
以下代码使用 starting_worker_process
钩子重新连接客户端:
if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| Mongoid.reconnect_clients if forked end end