我目前正在通過Elixir in Action,我正在對我的Todo
應用程序代碼進行一些重構,以便更好地掌握OTP的主要部分。在主管中有邏輯可以嗎?
該應用程序使用一個數據庫,它只是將數據存儲在磁盤上的文件中。爲確保數據庫的目標文件夾存在,在數據庫進程中調用File.mkdir_p!(db_folder)
。數據庫進程本身使用一堆工作進程來執行從磁盤實際存儲/檢索數據。
我目前的章節介紹了DIY流程註冊表,通過讓工作人員向註冊管理機構註冊並讓數據庫進程查找使用註冊表的工作人員來實施更加強大的監督樹,從而雙方都可以受到監督並會在失敗後繼續工作。
當Elixir 1.4出來時,我在補丁說明中看到了Registry
模塊,所以我想我可能會重構應用程序並使用它。現在事實證明,數據庫進程並不需要知道數據庫用於存儲數據的文件夾。所以我把mkdir_p!
叫出來,並考慮把它放在哪裏。兩個選項浮現在腦海中:
- 的
DatabaseWorker
- 的
DatabaseWorkerSupervisor
我個人比較傾向於第二種方法,因爲整個應用程序綁定,如果用戶沒有訪問權限反正崩潰持久性文件夾。但我不確定是否可以將邏輯放入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
我選擇了這個答案,因爲它直接回答了原來的問題。但是請注意,[這個答案](http://stackoverflow.com/a/43519122/4050456)如果我想'Database'是'GenServer'也是很有意義的。 –