Docs 菜单
Docs 主页
/ / /
Mongoid
/

分叉服务器配置

在本指南中,您可以学习;了解如何配置应用程序以使用分叉 Web服务器。

将 Mongoid 与分叉 Web服务器一起使用时,请遵循以下准则:

  • 如果可能,在 fork 之前不要在父进程中执行任何MongoDB操作。

  • 您可以通过执行以下操作来避免 Mongo::Error::SocketErrorMongo::Error::NoServerAvailable 等连接错误:

    1. 使用 方法在派生之前立即断开父Ruby进程中MongoDB客户端的连接。Mongoid.disconnect_clients这可确保父进程和子进程不会意外重复使用相同的套接字并发生 I/O 冲突。 Mongoid.disconnect_clients 不会中断任何正在进行的MongoDB操作,并在您执行新操作时自动重新连接。

    2. 在分叉后,立即使用 方法重新连接Ruby子进程中的MongoDB客户端。Mongoid.reconnect_clients这是在子进程中重新生成驱动程序的监控线程所必需的。

大多数 Web 服务器都提供钩子,应用程序可以使用这些钩子在工作进程分叉时执行操作。 以下部分提供了一些常见Ruby Web 服务器的配置示例。

使用on_worker_boot 钩子重新连接工作线程中的客户端。使用before_forkon_refork 钩子关闭父进程中的客户端。要学习;了解有关这些钩子的更多信息,请参阅 Puma API文档中的 集群模式钩子 。

以下代码使用示例Puma 配置文件中的 on_worker_bootbefore_forkon_refork 钩子:

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 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

使用 before_fork 钩子关闭父进程中的客户端。 使用 after_fork 钩子重新连接工作线程中的客户端。 要学习;了解有关这些钩子的更多信息,请参阅 Unicorn API文档中的配置器。

以下代码使用示例Unicorn 配置文件中的 before_forkafter_fork 钩子:

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

使用 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

后退

查询缓存中间件

在此页面上