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