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

相关文章
相关标签/搜索