【发布时间】:2017-09-16 15:39:38
【问题描述】:
我目前正在研究Elixir in Action,并且我正在重构我的Todo 应用程序代码,以便更好地掌握OTP 的主要部分。
应用程序使用的数据库只是将数据存储在磁盘上的文件中。为了确保数据库的目标文件夹存在,File.mkdir_p!(db_folder) 在数据库进程中被调用。数据库进程本身使用一堆工作进程来执行从磁盘实际存储/检索数据。
我目前所在的章节介绍了一个 DIY 进程注册表来实现更强大的监督树,通过让工作人员将自己注册到注册表并让数据库进程使用注册表查找工作人员,因此双方都可以受到监督和失败后仍然可以工作。
当 Elixir 1.4 发布时,我在补丁说明中读到了 Registry 模块,所以我想我可以重构应用程序并使用它。现在事实证明,数据库进程实际上并不需要知道数据库用于存储数据的文件夹。所以我从那个模块中取出mkdir_p! 调用并考虑把它放在哪里。我想到了两个选项:
-
DatabaseWorker -
DatabaseWorkerSupervisor
我个人更喜欢第二种方法,因为如果用户没有访问持久性文件夹的权限,整个应用程序肯定会崩溃。但我不太确定是否可以将逻辑放入 Supervisor 中。
根据具体情况,将逻辑放入 Supervisor 中是不好的风格还是可以接受的?如果风格不好,如果进程崩溃,我不想重复的启动逻辑放在哪里?
我的主管代码:
defmodule Todo.DatabaseWorkerSupervisor do
use Supervisor
def start_link(db_folder) do
Supervisor.start_link(__MODULE__, db_folder)
end
def init(db_folder) do
File.mkdir_p!(db_folder)
processes =
for worker_id <- 1..3 do
worker(Todo.DatabaseWorker, [db_folder, worker_id], id: {:dbworker, worker_id})
end
supervise(processes, strategy: :one_for_one)
end
end
【问题讨论】:
标签: elixir erlang-otp