現在想想也沒那麼難。保證原子性,無非就是需要某個單點去完成操作。那麼選擇玩家程序去做原子性工作就可以了。
比如要重置某個任務,需要花費金幣和揹包裡某個物品,那麼大概的邏輯是這樣的。在玩家程序裡
defreset_task(task_id) do
=task.reset_need
with
:ok =gold_enough(need_gold) #使用玩家程序的資料
:ok =bagserver.item_enough(need_item) #使用揹包程序的資料
do=cost_gold(need_gold) #使用玩家程序資料
:ok =bagserver.cost_item(need_item) #使用揹包程序資料
taskserver.reset(task_id) #使用任務程序資料
endend
只不過說這樣做以後,發覺bag和task程序做的工作也不多,不像玩家程序那麼活潑。
如果想讓bag和task有更多職責,你需要把reset_task之類的
操作直接交由他們做,比如如下。
defreset(task_id) do
need = =reset_need
with
:ok =playerserver.gold_enough(need_gold)
:ok =bagserver.item_enough(need_item)
do:ok =playerserver.cost(need) ## 這裡是原子的操作,同上面一樣操作cost
reset(task_id)
endend
但需要分清楚一些操作還是要交由某個單點去做(比如玩家程序),費心去理清這點,顯得煩人。
而且每個模組需要知道很多其他模組,比如taskserver需要使用bagserver,這也是乙個糟糕之處。
這麼一想,我還真找不到要劃分成應用(程序那種)的理由了;乙個庫應用,甚至於乙個模組就可以滿足需求。
Elixir遊戲服設計六
defmodule table do state accept 0 準備接入玩家 state ready 1 開局準備?defdelegate fetch t,key get and update t,key,list to map defstruct config,seats,state defn...
Elixir遊戲服設計一
在erlang遊戲服設計總結裡,我提到我想要的遊戲服設計方法,希望以應用做為基礎構建塊。最近我在學習elixir,它有很多 方便的語法糖以及很好用的庫,能夠解決我在遊戲中開發中碰到的很多繁瑣工作。因此我決定用它來做 練手,並期望下個專案中使用它。遊戲服的設計通常涉及如下東東 我將以乙個簡單的打牌遊戲...
簡單Elixir遊戲伺服器開篇
以前的elixir遊戲服設計系列種種原因沒有完成。後來雖然用elixir riak 完成了乙個麻將的初始版本,可惜公司也掛了。現在到新公司,比較空閒,想著像完成乙個心願一樣,還是重啟下吧 希望不要又爛尾 改頭換面叫簡單elixir遊戲伺服器系列。一些說明 0.沒怎麼寫過部落格,也懶得去研究了,說到哪...