2012-09-11 30 views
0

我正在Erlang編寫一個Web應用程序,並希望將我的數據存儲到PostgreSQL。在Erlang中爲PostgreSQL編寫網關是個好主意嗎?

我的應用程序中有兩種資源。一種非常重要,而另一種則不重要。

  • 重要的是,不允許丟失數據。
  • 對於不太重要的系統故障導致的數據丟失是可以的。

我想獲得最大的效率,想出了這樣一個想法:爲PostgreSQL寫一個網關。網關是gen_server,業務邏輯(BL)部分可以與網關通信以存儲資源。

  • 爲了存儲重要的資源,BL部件發送的資源被存儲到網關,並receive的消息(成功或失敗),最後以與網頁用戶作出響應。
  • 爲了存儲不那麼重要的資源,BL部分僅將資源發送到網關而不阻止。發送資源後,BL部分直接響應網頁。

我從這個想法期待什麼是每個請求少秒,因爲大部分資源是不太重要的。但我想知道這是一個好主意,換句話說,我真的可以得到我期待的結果嗎?

請根據您的經驗或一些可靠的「網頁搜索結果」回答。謝謝。 :-)

回答

4

我可以看到兩個問題,你的建議:

  1. 發送到gen_server網關將被序列化(阻塞或非阻塞)
  2. 如果gen_server網關進程崩潰的所有信息,你將至少丟失進程郵箱中的郵件。

我會做的是創建一個輔助模塊(而不是一個進程),將負責數據庫交互。這個過程將使用支持連接池的postgresql庫(因此對DB的調用可以有一些並行性)。

如果您希望爲不太重要的資源執行非阻塞的數據庫操作,只需生成一個進程即可進行數據庫交互並繼續前進。

一些鏈接到PostgreSQL二郎庫(我沒有使用任何):

Postgresql connection pooling in Erlang

http://zotonic.com/page/519/epgsql-postgresql-driver

+0

是的,我想產卵的過程爲DB互動的想法是比較適合。但是對於問題(1),由於我也在編寫Erlang中的BL部分,這些消息是否仍然序列化? –

+0

gen_server網關將序列化請求,因爲它一次只處理一條消息。使用網關的阻塞進程將不得不在隊列中等待。 – Isac

相關問題