2015-05-27 34 views
4

我想弄清楚,如果我有兩個例程調用相同的zeromq套接字,如果從例程1上的socket.recv()返回返回..套接字將知道返回到例程1(例程2,...例程n)。ZeroMQ知道去哪個例程的請求來自

因此......使用具有請求/響應語義的消息傳遞總線,什麼是最好的模式來解決這個問題呢?

如果有幫助..想想簡單的盜版模式,並用zeromq實現該模式中的RPC樣式調用集。

Socket; //zeromq socket 
//routine 1 
socket.send(data) // do i need some identifier here for this routine? 
socket.recv() // wait until i get a response from that send 
//routine 2 
socket.send(data) 
socket.recv() 

所以在這種情況下,我不知道如果從例程1或例程2的響應將首先回來。我怎樣才能確保,當我得到一個響應套接字...我可以通知正確的例程'recv()函數。

謝謝!

+0

請提供您更多的代碼,或者至少更完全充實的例子。你打算在一個線程還是多個線程中執行此操作?你使用哪種套接字類型在這個(客戶端?)端和你使用的對等端上?你如何連接/綁定?你的代碼/數據中的一個「例程」與另一個「例程」有什麼區別?取決於這些問題的答案,有許多可能的解決方案。 – Jason

+0

我對ZeroMQ沒有任何經驗/知識,但在過去,當我有多個goroutines通過共享websocket發出請求時,我有一箇中央goroutine,其中實際寫入請求和響應讀取請求。該函數有一個輸入通道({request,response channel}),一個未完成的請求id(按順序生成)的映射,並且只使用該映射找到發送響應正文的適當通道(或者記錄和放下如果沒有地圖條目)。 –

+0

嗯,我沒有Go的經驗/知識,所以我們不做一對:)。如果你還沒有閱讀[The Guide](http://zguide.zeromq.org/page:all),我強烈建議你這樣做,Go中有各種各樣的例子(當你看到一個代碼示例,會有許多不同語言版本的鏈接,快速瀏覽一下,它們大多數都有Go版本)。你可能會看到你想要做的,並看到它正在完成的一個例子。 – Jason

回答

1

我不相信一個插座可以用zeromq

可能你需要做某種夠程的監聽請求共享,同時,線程之間,發送/接收ZMQ,然後回覆。

例如:(未經測試的代碼)

type Req struct { 
    Data []byte 
    Reply chan []byte 
} 

go func() { // probably not the zmq api, but you should get the idea here 
    for req := <- requests { 
     socket.send(req.Data) 
     req.Reply <- socket.recv() 
    } 
} 
相關問題