Elixir 系统进程管理与动态启动实践
1. 数据库工作进程监督
1.1 引入独立监督者的原因
在系统中,为了减少单个进程问题对整个系统的影响,我们引入独立的监督者来管理数据库工作进程池。如果将过多的子进程放在同一个监督者下,当重启过于频繁时,监督者可能会放弃并终止所有子进程,导致系统大部分进程重启。而使用独立监督者,可将数据库重启失败的影响限制在数据库操作范围内。
1.2 数据库模块改造
我们将 Todo.Database 模块改造成监督者,以下是具体代码:
defmodule Todo.Database do
@pool_size 3
@db_folder "./persist"
def start_link do
File.mkdir_p!(@db_folder)
children = Enum.map(1..@pool_size, &worker_spec/1)
Supervisor.start_link(children, strategy: :one_for_one)
end
defp worker_spec(worker_id) do
default_worker_spec = {Todo.DatabaseWorker, {@db_folder, worker_id}}
Supervisor.child_spec(default_worker_spec, id: worker_id)
end
def child_spec
超级会员免费看
订阅专栏 解锁全文
45

被折叠的 条评论
为什么被折叠?



