請看下面的用例。使用底層請求/響應協議(SIP上的JSON-RPC)實現RPC
我有一個客戶端(Java)應用程序,它想要獲取/設置另一個遠程應用程序(C)的狀態。它們之間的通信是通過在另一個線程中運行的SIP完成的。
。SIP接口可以執行以下操作:
的sendMessage onRequest
我對架構兩種思路:
RPC(JSON-RPC)
定義一個類它對JSONRPCRequests和JSONRPCResponse進行編組/解組(http://software.dzhuvinov.com/json-rpc-2.0-base.html)
定義一個Invoker類,它有一個類似調用(服務器,名稱,參數)方法的東西。
在祈求類,名稱和參數放入JSONRPCRequest並通過SIP層的sendMessage
現在到了我的問題發送。我怎樣才能讓回到調用者的權利?控制流程如下:
onRequest方法被調用,但我現在知道它是否是我以前調用的答案。我所做的就是將所有響應到達我的服務器到一個地圖,並在調用者中輪詢該列表。
粗略的草圖可能是;
調用器(提供API,以客戶端)
class Invoker {
private Channel channel;
public Invoker(Channel channel) { this.channel = channel; }
public Object call(String server, String name, Object .. args) {
JSONRPCRequest req = ...;
channel.sendMessage(server, req.toString());
while(! channel.hasResponse(req.id()) {
Thread.sleep(42);
}
return channel.getResponse(req.id()).result();
}
}
信道(接口信使):
class Channel {
private Map<Object, JSONRPCResponse> responses = new //;
private Sip sip = new Sip() {
public void onRequest(String msg) {
JSONRPCResponse response = JSONRPCResponse.parse(msg);
responses.put(msg.id(), response);
}
};
public void sendMessage(String server, String message) {
sip.sendMessage();
}
public boolean hasResponse onRequest(Object id) {
responses.hasKey(id);
}
public JSONRPCResponse getResponse(Object id) {
responses.get(id);
responses.delete(id);
}
}
SIP(信使本身):
abstract class Sip {
public void sendMessage(String msg) {
// SIP magic
}
public abstract void onRequest(String msg);
}
有沒有更好的方法來做到這一點?我最大的問題/代碼的氣味是:
- 阻塞在祈求
- 該協議在祈求,也許我想改用編組到別的東西
- 地圖爲平均得到了正確的響應要求
- 的SIP抽象方法看起來很奇怪
- 沒有錯誤處理
- 無超時
消息傳遞
是否有一種簡單的方法來擺脫RPC,並實現類似RPC的消息傳遞?歡迎任何模式提示。我不需要代碼本身,我對於架構完全沒有問題。我嘗試谷歌消息傳遞實現,以及他們如何實際改變狀態,但我沒有發現任何有用的東西。如何實現超時/錯誤處理?
任何有關該主題的優秀書籍/文獻也是受歡迎的,因爲我從未編寫過這樣的分發內容。
在SIP內部使用哪種協議來改變狀態的任何其他想法也是受歡迎的,因爲RPC是我最初的想法,並且我沒有發現任何其他有用的東西。
代碼不會編譯,我想這只是想象我的想法。
我的問題之一是關聯請求/響應消息。是否有一些關於該主題的標準程序/模式或文獻可能知道? – reindeer
這一切都取決於協議。如果您使用JAIN-SIP之類的SIP庫,我相信它可以將響應與請求關聯起來。 –