【问题标题】:Implement RPC with underlying request/response protocol (JSON-RPC on SIP)使用底层请求/响应协议实现 RPC(SIP 上的 JSON-RPC)
【发布时间】: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 是我最初的想法,我没有发现任何其他有用的东西。

代码不会编译,我猜,只是为了形象化我的想法。

【问题讨论】:

    标签: java callback sip rpc


    【解决方案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 接口的实现可以使用任何合适的协议,但它必须将请求与响应关联起来才能调用正确的回调。

    【讨论】:

    • 我的一个问题是关联请求/响应消息。您可能知道关于该主题的一些标准程序/模式或文献吗?
    • 这一切都取决于协议。如果您使用像 JAIN-SIP 这样的 SIP 库,我相信它可以将响应与请求相关联。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多