2012-06-14 60 views
2

我有一個遊戲服務器,它承載了多個遊戲實例。玩家可以輸入ID加入當前正在運行的遊戲。爲了將客戶與他們想要的遊戲實例配對,我有一個ETS表,它將遊戲ID映射到處理特定遊戲實例的Erlang進程的PID。雖然這有效,但我並不喜歡使用ETS,因爲它創建的是不受任何一個進程控制的全局數據。將ID映射到OTP/Erlang中的進程的習慣用法是什麼?

我想知道的是:Erlang/OTP中是否有一種慣用的方式將標識符映射到進程?在這種情況下使用ETS ok,因爲數據本身就是全球性的?或者我應該有一個存儲處理映射的所有ID的字典的進程?我覺得這是更多的Erlang風格,但可能不是性能或併發。我看到其他SO答案時也遇到了gproc,這似乎是一個改進的過程字典。不過,我的印象是,使用過程字典是皺眉(according to the erlang.org web page)。

+0

'gproc'(http://rustyklophaus.com/articles/20090916-GProcErlangGlobalProcessRegistry.html)就好。與內置的過程字典相比,其已知更穩定/改進。你也可以使用'mnesia'內存表,但我認爲'ETS'也很好。 –

+1

看看這個問題http://stackoverflow.com/questions/5319553/what-distributed-process-registries-are-available-for-erlang – loxs

回答

6

ETS tables可以通過給定處理/ gen_server被控制,並且其所有權可以從過程被轉移期間通過ets:give_away/3或表創建過程中heir option麻煩倍來處理。

許多遊戲開發者依賴於像memcached這與ETS沒有區別(故意)。但是,mnesia是一個非常穩定的OTP應用程序,與ETS相比,它可以處理更多的併發更新。我們在非常繁忙的應用程序中使用了mnesia,除非整個虛擬機由於其他問題而關閉,否則它一直沒有關閉。實際上,在erlang中構建的大多數可用系統都依靠mnesiaETS來共享冗餘組件之間的狀態,以便在一個故障轉移到另一個故障時,內存數據可用。

gproc是一個非常方便的工具,特別是像遊戲的東西。這是因爲,一個進程取決於它自己的易於訪問的數據。沒有其他進程可以查找另一個進程的數據。因此,不要在ETS中保持遊戲狀態,您還可以使用gproc

無論如何,如果你有時間,你可以嘗試每個選項,並做一些負載測試,看看哪一個更好。

+2

也不建議在全局模式下運行'gproc'。 – Tilman

+0

是真的,但是:通過負載測試,您會發現'gproc'非常穩定。 –

+0

不確定,在負載測試時,我遇到了gproc中有許多全局註冊進程的'gen_leader'崩潰問題。 – Tilman

相關問題