【发布时间】:2014-08-14 16:17:29
【问题描述】:
看下面的用例。
我有一个客户端 (Java) 应用程序,它想要获取/设置另一个远程应用程序 (C) 的状态。它们之间的通信是通过 SIP 完成的,它在另一个线程中运行。
SIP 接口可以做以下事情:
发送消息 请求
我对架构有两个想法:
RPC (JSON-RPC)
定义一个对 JSONRPCRequests 和 JSONRPCResponse 进行编组/解组的类 (http://software.dzhuvinov.com/json-rpc-2.0-base.html)
定义一个 Invoker 类,它有一个类似于 call(server, name, arguments) 方法的东西。
在 Invoker 类中,名称和参数被放入 JSONRPCRequest 并通过 SIP 层 sendMessage 发送
现在我的问题来了。我如何真正将权利返回给呼叫者?现在的控制流程是:
调用了 onRequest 方法,但我现在知道它是否是我之前调用的答案。我所做的是将到达我的服务器的所有响应放入一个 Map,然后在 Invoker 中轮询该列表。
可能是粗略的草图;
调用者(向客户端提供 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);
}
有没有更好的方法来做到这一点?我最大的问题/代码气味是:
- Invoker 中的阻塞
- 协议在 Invoker 中,也许我想将编组转换为其他内容
- 地图作为获取请求正确响应的手段
- SIP 抽象方法看起来很奇怪
- 无错误处理
- 没有超时
消息传递
有没有一种简单的方法可以摆脱 RPC,并通过消息传递来实现类似 RPC 的东西?欢迎任何有关模式的提示。我不需要代码本身,我对架构完全没问题。我试图用谷歌搜索消息传递实现,以及它们实际上如何改变状态,但我没有发现任何有用的东西。如何实现超时/错误处理?
也欢迎任何关于该主题的好书/文献,因为我从未编写过这样的分布式东西。
也欢迎任何其他关于在 SIP 中使用哪种协议来更改状态的想法,因为 RPC 是我最初的想法,我没有发现任何其他有用的东西。
代码不会编译,我猜,只是为了形象化我的想法。
【问题讨论】: