Elixir遊戲服設計五

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

相關文章
相關標籤/搜索