请看以下用例。
我有一个客户端(Java)应用程序,它希望获取/设置另一个远程应用程序(C)的状态。它们之间的通信是通过SIP完成的,它在另一个线程中运行。
SIP接口可以执行以下操作:
的sendMessage onRequest
我对架构有两个想法:
RPC(JSON-RPC)
定义一个为JSONRPCRequests和JSONRPCResponse(http://software.dzhuvinov.com/json-rpc-2.0-base.html)进行编组/解组的类
定义一个Invoker类,它类似于调用(服务器,名称,参数)方法。
在Invoker类中,名称和参数被放入JSONRPCRequest并通过SIP层发送sendMessage
现在出现了我的问题。我如何实际回到呼叫者?控制流程现在是:
调用onRequest方法,但我现在知道它是否是我之前调用的答案。我所做的是将所有响应到达我的服务器到Map中,然后在Invoker中轮询该列表。
粗略的草图可能是;
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);
}
有没有更好的方法呢?我最大的问题/代码气味是:
消息传递
有没有一种简单的方法可以摆脱RPC,并只使用消息传递实现RPC之类的东西?任何有关模式的提示都是受欢迎的。我不需要代码本身,我完全没有架构。我试图谷歌消息传递实现,以及他们如何实际改变状态,但我没有找到任何有用的东西。如何实现超时/错误处理?
关于该主题的任何好书/文献也是受欢迎的,因为我从未编写过这样的分布式内容。
在SIP中使用哪种协议来改变状态的任何其他想法也是受欢迎的,因为RPC是我最初的想法,我没有找到任何其他有用的东西。
代码不会编译,我想,这只是想象我的想法。
答案 0 :(得分:1)
定义具有有意义(对于美国案例)方法的服务接口。不要使用阻塞调用,让客户端提供一个ResponseHandler,它将在操作完成时调用:
interface ResponseHandler {
void onComplete(Response response);
void onError(Throwable error);
}
interface SomeService {
void set(String attribute, Object value, ResponsHandler responseHandler);
void get(String attribute, ResponseHandler responseHandler);
}
Service接口的实现可以使用任何合适的协议,但它必须将请求与响应相关联,以便调用正确的回调。