• 请不要在回答技术问题时复制粘贴 AI 生成的内容
alexapollo
V2EX  ›  程序员

关于 IPC & RPC - 一图胜千言

  •  
  •   alexapollo ·
    geekan · Jun 4, 2016 · 7325 views
    This topic created in 3656 days ago, the information mentioned may be changed or developed.

    传送门: http://www.anwcl.com/wordpress/ipc-rpc/

    如图,各个部分都可以简单抽象出来
    1

    如JSON-RPC,是RPC-SOCKET-JSON的组合
    2

    有一些技术如信号量、队列(linux)、文件锁没有放进来,但广义上它们也是IPC的一部分。

    20 replies    2016-06-05 19:21:43 +08:00
    alexapollo
        1
    alexapollo  
    OP
       Jun 4, 2016
    果然没有 argue 就没有人气吗?
    Scala 是最好的语言?
    finian
        2
    finian  
       Jun 4, 2016
    你这个分类(分层)完全没有逻辑性。。。为毛 HTTP 和 JSON 会分在一起?同是数据序列化协议的 JSON 和 PB ,为什么采用二进制的就算底层?
    neoblackcap
        3
    neoblackcap  
       Jun 4, 2016
    主要是我感觉完全看不懂你的图,左右对照的分别是什么,若是实现跟协议,那么最后为什么来个 RPC 跟 IPC 放在一起的格子。
    还有这个上到下的顺序是什么? HTTP 上层? Protobuf 底层? HTTP 又不建立于 Protobuf 之上,何来 HTTP 更上层一说。
    dgkae
        4
    dgkae  
       Jun 4, 2016
    不错~
    alexapollo
        5
    alexapollo  
    OP
       Jun 4, 2016
    @finian JSON 、 HTTP 、 XML 都是文本协议,解析效率很低,而且一般也用在比较高的协议层级(如基于 HTTP ),做通用通信;
    而 binary 、 protobuf 这种二进制协议,一般是只能用在特定的一套体系内、不通用的、底层的,所以分开了。
    有其他更好表达这两类区别的方法吗?
    alexapollo
        6
    alexapollo  
    OP
       Jun 4, 2016
    @neoblackcap 左右不是对照的,但可以组合,协议的底层和高层是切分两类协议,没有依赖关系
    neoblackcap
        7
    neoblackcap  
       Jun 4, 2016
    @alexapollo 讲道理的话我觉得你应该参照 TCP 协议栈来画图,而且 protobuf 就是二进制协议了,二进制协议根本就已经囊括了 protobuf 。一般来说我们会认为不经过解析之后就没法让人阅读的协议为二进制协议。

    协议根本没什么跨体系通用一说,你只要协议相同的自然能相同。你说的 JSON 通用,只不过是支持这一数据格式的服务更多罢了。

    还有就是你的图若是没有什么对照的话请不要将中线加粗,真的很容易让人误解。
    yangmls
        8
    yangmls  
       Jun 4, 2016
    这是什么鬼。。。

    二进制和文本哪有什么高低之分,看来你不知道怎么用 http 1.x 的 payload 来传输 protobuf 。。。而且这图根本无法解释 http 2 这种上面跑文本,底层却跑二进制的协议
    alexapollo
        9
    alexapollo  
    OP
       Jun 4, 2016
    @neoblackcap 对。但不同协议应用的场景比较不同,你见过跨系统的通用 protobuf 传输吗?
    protobuf 本身有一些依赖,如定义好的协议结构,而且只要对 protobuf 本身有微小的修改就很容易导致不兼容,但 JSON 、 XML 、 HTTP 却很通用,序列化和反序列化是通用的。

    二进制一般来说比较偏向共享内存、预定义结构这种场景。。跟 protobuf 比没有序列化和反序列化的过程。 protobuf 就是整合了不同语言,但会有额外的开销,还是不同的。

    @yangmls 速度差距比较大。。
    alexapollo
        10
    alexapollo  
    OP
       Jun 4, 2016
    @neoblackcap 参考协议栈画图也可以。。会清晰一点。但就很难说清楚这几者之间的区别了。
    neoblackcap
        11
    neoblackcap  
       Jun 4, 2016
    @alexapollo 你那根本就是伪逻辑,若是系统中通用 protobuf 你就认为这些是一个系统,若是换成 json 你就认为他们是不同的系统,这样根本没法说。

    而且你的 JSON , XML , HTTP 是什么鬼?若是 XML 也可以勉强说是数据格式, HTTP 跟它并列是什么意思。 HTTP 根本不管你这些好不好,别人是『超文本传输协议』,若是 HTTP 也算的话,那么 FTP 也应该算是。
    alexapollo
        12
    alexapollo  
    OP
       Jun 4, 2016
    @neoblackcap 恩,后者是笔误,应该是 HTML

    你那根本就是伪逻辑,若是系统中通用 protobuf 你就认为这些是一个系统,若是换成 json 你就认为他们是不同的系统,这样根本没法说。
    > 你这说反了吧,就像我们说语言有高级低级之分,高级语言当然也能干低级的事,但低级语言很多时候就干不了高级的活,或者说,代价很大
    neoblackcap
        13
    neoblackcap  
       Jun 4, 2016
    @alexapollo protobuf 我能想到就是解析快,传输小, json 就是人可阅读。
    若是可以的话,我希望你能说出一些 json 能做,而 protobuf 不能做的,请千万不要说 json 能加字段而不报错。因为别人本身就是 schema 的, json 也是有 json-schema 的,但是大概用得人比较少。
    alexapollo
        14
    alexapollo  
    OP
       Jun 4, 2016
    @neoblackcap 未知协议格式, json 可以被解析,而 protobuf 不行

    难不成目前有 protobuf 自动解析的方法?我还真不知道
    9hills
        15
    9hills  
       Jun 4, 2016 via iPhone
    这张图实在是看不懂逻辑。。。是我太愚钝了
    dphdjy
        16
    dphdjy  
       Jun 4, 2016 via Android
    @alexapollo keywords : protobuf DynamicMessage
    josephshen
        17
    josephshen  
       Jun 4, 2016 via iPhone
    瞎写乱画
    Mirana
        18
    Mirana  
       Jun 5, 2016 via iPhone
    http 是传输协议, json xml protobuf 是序列化的协议,不管用什么序列化数据,最后传输的都是二进制的数据。
    mengzhuo
        19
    mengzhuo  
       Jun 5, 2016 via iPhone
    这都什么玩意啊……别误人子弟好么
    http 竟然算高层?
    pb 和 json 本质上没有区别啊!
    yuantops
        20
    yuantops  
       Jun 5, 2016
    http 居然和 JSON 并列在一起,恍惚间理论体系崩坏的感觉。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3784 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 10:30 · PVG 18:30 · LAX 03:30 · JFK 06:30
    ♥ Do have faith in what you're doing.