使用底层请求/响应协议实现RPC(SIP上的JSON-RPC)

时间:2014-06-24 11:55:39

标签: java callback sip rpc

请看以下用例。

我有一个客户端(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);    
}

有没有更好的方法呢?我最大的问题/代码气味是:

  • Invoker中的阻止
  • 协议在Invoker中,也许我想将编组转换为其他内容
  • 将地图视为获取请求的正确回复
  • SIP抽象方法看起来很奇怪
  • 无错误处理
  • 没有超时

消息传递

有没有一种简单的方法可以摆脱RPC,并只使用消息传递实现RPC之类的东西?任何有关模式的提示都是受欢迎的。我不需要代码本身,我完全没有架构。我试图谷歌消息传递实现,以及他们如何实际改变状态,但我没有找到任何有用的东西。如何实现超时/错误处理?

关于该主题的任何好书/文献也是受欢迎的,因为我从未编写过这样的分布式内容。

在SIP中使用哪种协议来改变状态的任何其他想法也是受欢迎的,因为RPC是我最初的想法,我没有找到任何其他有用的东西。

代码不会编译,我想,这只是想象我的想法。

1 个答案:

答案 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接口的实现可以使用任何合适的协议,但它必须将请求与响应相关联,以便调用正确的回调。