在《Elixir遊戲服設計一》裏提到,按照系統功能劃分紅app要保證原子性很難,app
如今想一想也沒那麼難。保證原子性,無非就是須要某個單點去完成操做。那麼選擇玩家進程去作原子性工做就能夠了。spa
好比要重置某個任務,須要花費金幣和揹包裏某個物品,那麼大概的邏輯是這樣的。在玩家進程裏設計
def reset_task(task_id) do {need_gold, need_item} = Task.reset_need with :ok = gold_enough(need_gold) #使用玩家進程的數據 :ok = BagServer.item_enough(need_item) #使用揹包進程的數據 do {:ok, new_state} = cost_gold(need_gold) #使用玩家進程數據 :ok = BagServer.cost_item(need_item) #使用揹包進程數據 TaskServer.reset(task_id) #使用任務進程數據 end end
只不過說這樣作之後,發覺Bag和Task進程作的工做也很少,不像玩家進程那麼活潑。code
若是想讓Bag和Task有更多職責,你須要把reset_task之類的blog
操做直接交由他們作,好比以下。遊戲
def reset(task_id) do need = {need_gold, need_item} = reset_need with :ok = PlayerServer.gold_enough(need_gold) :ok = BagServer.item_enough(need_item) do :ok = PlayerServer.cost(need) ## 這裏是原子的操做,同上面同樣操做cost reset(task_id) end end
但須要分清楚一些操做仍是要交由某個單點去作(好比玩家進程),費心去理清這點,顯得煩人。進程
並且每一個模塊須要知道不少其餘模塊,好比TaskServer須要使用BagServer,這也是一個糟糕之處。it
這麼一想,我還真找不到要劃分紅應用(進程那種)的理由了;一個庫應用,甚至於一個模塊就能夠知足需求。class