2015-09-19 80 views
4

Erlang非常擅長通過不共享狀態來清理事物。但是當你想要共享狀態時會發生什麼?例如:配置選項,統計信息收集,事件/回調服務器。用一些記錄作爲狀態或使用流程字典產生一個新的進程是一種完成共享狀態的方法。你會反覆循環該過程並回復任何消息。多個進程將使用什麼本質上不純的getter和setter函數來遍歷消息傳遞來查詢該進程,但是在這裏我們只是將Erlang變成了一個比java對象慢的不純對象,這是因爲減少系統輪流比僅僅擁有更慢每個全局狀態周圍的內存互斥。如果我們不小心,它甚至有可能發生郵箱溢出。當你需要Erlang的高性能共享狀態時,你會做什麼?

那麼,如果你想要快速共享狀態,你該怎麼做? Reddis,一個數據庫mnesia,會產生循環狀態?你如何讓集中狀態在erlang中更加純粹的功能?

+3

對不起 - 你爲什麼用「elixir」標記這個問題? –

+1

因爲它是一樣的虛擬機 – BreezyChick89

+1

這是如何影響你的問題?添加joxa標籤是否合適?如何喝口香糖的Erlang?如果你的問題是關於Erlang這是它應該在其上的唯一標籤。 –

回答

6

使用named_table選項創建的公共(任何人都可以讀取或寫入)或受保護(一個作者,多個讀者)ets table。每個需要訪問表中共享狀態的進程都可以通過其名稱進入表。

+1

如果您在大型系統中使用ETS,根據使用情況,啓用「write_concurrency」和/或「read_concurrency」選項進行測試和基準測試也會很有趣。 –

+0

你認爲這比使用進程字典作爲狀態的gen_server更可取嗎?我知道ETS背後有一些C代碼,並不像mnesia,它是純粹的Erlang。 – BreezyChick89

+2

@ BreezyChick89,使用進程字典表示狀態的'gen_server'的問題是任何需要訪問狀態的進程必須調用'gen_server'進程來獲取它,並且'gen_server'可能會成爲瓶頸。我在2011年寫了一篇關於流程瓶頸的文章(http://steve.vinoski.net/blog/2011/03/19/process-bottlenecks-in-erlang-web-apps/),探討了類似的問題。 –

相關問題