2014-07-25 48 views
1

我正在嘗試使用java實現與客戶端一樣的服務。我正在使用Apache thrift進行RPC調用。該服務使用鍵值存儲。我試圖在鍵值存儲中提供服務容錯以及一致性和數據複製。Apache Thrift:具有同步和異步方法的服務器,有可能嗎?

對於例如:假設在同一時間,有id爲運行10臺服務器 S1,S2,S3等,以及一個客戶端調用放(鍵,值)對S1,S1現在保存 這個值和通話在所有其餘服務器 上放置一個RPC(鍵值)用於數據複製。我希望服務器方法保存並將 成功返回給客戶端,並在其餘9臺服務器上啓動帶有異步調用的線程,以便 複製期間不會阻止客戶端。

自動生成的代碼有Iface和AsyncIface,我目前在ServerHandler類中實現了Iface。

我的目標是向客戶端公開一個後端服務器,並在客戶端和服務器之間進行正常(阻塞)調用,並在服務器之間進行異步調用。將一次運行多個客戶端 - 服務器對。

據我所知,數據複製模型很粗糙,但我試圖學習分佈式系統。

有人可以幫我一個例子,我怎麼能做到這一點。

而且,如果你認爲我的設計是有缺陷的,也有在 更好的方法,我可以使用Apache節儉請不要 點出實現數據複製。

謝謝。

+0

http://stackoverflow.com/questions/18911972/how-to-handle-requests-using-different-thread-pools-in-thrift看來此人有做了同樣的事情,但我不知道如何 – user3427096

+0

Multiplex是不同的。它允許在同一傳輸棧上運行多個服務。這可能不是你正在尋找這個問題。但是,如果你想結合公共服務和內部通信服務,但是(a)你不會被強迫這樣做,並且(b)你可能想要爲公共和內部服務使用不同的協議/傳輸。 – JensG

回答

2

A oneway方法是異步的,任何其他未標記爲oneway的方法都是同步的。

exception OhMyGosh { 
    1: string msg 
} 

service TwelfthNightOrWhatYouWill { 

    // A oneway method is a "one shot" method. The server may execute 
    // it asynchronously, depending on the server implementation 
    // Oneways can be very useful when used with messaging systems 
    // A oneway does NOT return anything, including exceptions 
    oneway void ImAsync(1: i32 foo, 2: string bar, 3: double baz) 

    // Any method not marked with oneway is synchronous. Even if the call does 
    // not return anything, it will be still a blocking call for the client. 
    void ImSynchronous(1: i32 foo, 2: string bar) throws (1: OhMyGosh omg) 
    i32 ImAsWell(1: double baz) throws (1: OhMyGosh omg) 
    void MeToo() 
} 

無論服務器不執行oneway異步相對於連接,要看你用什麼服務器實現。 Threaded或Threadpool服務器似乎是一個不錯的選擇。

在客戶端發送了他的oneway請求之後,它不會等待服務器的回覆,而是繼續執行他的執行流程。技術上,對於oneway,不生成recv_Xxxx()函數,只生成send_Xxx()部分。

如果您需要將數據發送回客戶端,最好的選擇是在客戶端進程中設置一個服務器,這對於我來說似乎是您特定用例的最佳選擇。在不可能的情況下(想想HTTP),典型的解決方法是輪詢或長時間運行的調用,但是這兩種技術都有一些缺點。


With apolagies to W.Shakespeare