2014-03-04 82 views
0

此問題是之前詢問過的Including the Erlang client lib的延續。使用來自Riak的氮氣中的Erlang客戶端庫

我能夠通過改變包括圖書館:

​​

到:

{mimetypes,  ".*", {git, "git://github.com/spawngrid/mimetypes", {branch, master}}}, 

{riakc, "1.4.1", 
      {git, "git://github.com/basho/riak-erlang-client", 
         {tag, "1.4.1"}}}, 


%% Uncomment the following lines and comment the bottom lines with specific 
%% tags to always pull the latest versions 
{nitrogen_core, ".*", {git, "git://github.com/nitrogen/nitrogen_core",{branch, master}}}, 

rel/nitrogen/rebar.configlib文件夾下用make重新編譯

現在,我已經與安裝,我不知道我應該在哪裏實施riakc_pb_socket庫作爲suggested in the docs

我試圖把

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 

nitrogen_sup:init()但我收到此錯誤信息:

application: nitrogen 
exited: {{{badmatch,{error,{tcp,econnrefused}}}, 
      [{nitrogen_sup,init,1, 
         [{file,"/home/neil/proj/nitrogen/rel/nitrogen/site/src/nitrogen_sup.erl"}, 
          {line,43}]}, 
      {supervisor,init,1,[{file,"supervisor.erl"},{line,239}]}, 
      {gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]}, 
      {proc_lib,init_p_do_apply,3, 
        [{file,"proc_lib.erl"},{line,239}]}]}, 
     {nitrogen_app,start,[normal,[]]}} 
type: temporary 

我應該做這方面的應用程序初始化過程中一次了Riak數據庫,或者經常作爲處理新的請求。我看了一些關於連接池的討論,這是否會在應用程序初始化期間設置一次,然後鏈接到新進程。

我是新來erlang/OTP和這個框架,所以任何方向將不勝感激。

補充說:

當我運行通過bin/nitrogen console氮的應用程序,我能夠運行{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1",8087).我也設法從riakc_pb_socket:ping(Pid).

得到pong回來,我想現在的問題是:在哪些文件通常設置/管理關於查詢/讀取/寫入的riak連接?

回答

2

一種方式來獲得,事情正在進行的是:

  1. 創建gen_server您添加到應用程序的監督樹。最好是你自己的應用程序,你包括。
  2. gen_server初始化時,它建立一個Riak連接。只要你想使用連接,你callgen_server,因爲它有連接,它將能夠發出查詢。
  3. 處理重新連接。如果連接丟失,則會崩潰gen_server。如果連接在初始化時被拒絕,您稍等一會再試一次。

通常,您會看到一個單獨的應用程序,運行Erlang系統的「後端」工具,然後運行另一個應用程序(如氮氣)來處理Web內容。您的gen_server將屬於「後端」部分。

一旦這個基礎上運作的,你可以進一步擴展它:

  • 你gen_server將生活名爲foo模塊中。無論何時您想使用riak,請致電foo:f(...)。重寫foo:f(...)以使用http://github.com/devinus/poolboy或類似的東西來支持連接池到Riak集羣。但只有在證明單個連接速度太慢後才能做到這一點。

這個整齊地顯示了在Erlang程序中鬆耦合的想法。 foo模塊就像一個接口,但您不知道該接口背後的實現。如有需要,您可以稍後更改,以便更快速地完成。你唯一需要做的就是實現正確的協議,在這種情況下這是一個函數調用。

+0

感謝您的回答。不過,我會花一點時間在接受之前消化/嘗試您的建議解決方案。 – neildaemond