V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
abersheeran
V2EX  ›  程序员

无需申明格式的跨语言高性能序列化格式有哪些?

  •  1
     
  •   abersheeran · Feb 23, 2021 · 4933 views
    This topic created in 1900 days ago, the information mentioned may be changed or developed.

    目前我知道的只有 msgpack,据说 Protocol Buffer 这种需要申明格式的都比它略慢一筹。

    那么还有没有别的呢?

    23 replies    2021-02-25 01:12:55 +08:00
    paoqi2048
        1
    paoqi2048  
       Feb 23, 2021   ❤️ 2
    看看 CBOR
    awm47
        2
    awm47  
       Feb 23, 2021
    咋一看有点像 redis 的序列化协议 redis.io/topics/protocol
    DoctorCat
        3
    DoctorCat  
       Feb 23, 2021
    自己 diy 就行了,然后 snappy 算法压缩
    abersheeran
        4
    abersheeran  
    OP
       Feb 23, 2021
    @paoqi2048 感谢,已经看了。加入 TODO 里了。https://github.com/abersheeran/rpc.py/issues/5
    so1n
        5
    so1n  
       Feb 24, 2021
    msgpack 就挺好的...我自己写的 rpc 用的就是 msgpack, 然后复用单链接 速度贼快....
    tsui
        6
    tsui  
       Feb 24, 2021
    https://github.com/FasterXML/jackson-dataformats-binary 支持的看了也就 CBOR 或者 ion
    abersheeran
        7
    abersheeran  
    OP
       Feb 24, 2021
    @so1n 实际业务里单核每秒能有多少?我希望是能有四位数以上的速度。
    abersheeran
        8
    abersheeran  
    OP
       Feb 24, 2021
    @abersheeran 因为我司确定要上微服务了……我是主力开发,我不想用 grpc,太蛋疼了。
    Visionhope
        9
    Visionhope  
       Feb 24, 2021
    @paoqi2048 网上搜了下, 看样子 CBOR 是 msgpack 的 fork, 有很多相似之处.
    so1n
        10
    so1n  
       Feb 24, 2021 via Android
    @abersheeran 本机的话 1000 并发 0.3 秒,线上的还没上去试。简单看一下你那个是依赖 http 一发一收的?这样速度好像不快。
    速度这里需要序列化和传输层一起优化,链接复用后速度很快,不过还需要一些问题去解决,我还没弄好。
    so1n
        11
    so1n  
       Feb 24, 2021 via Android
    @abersheeran async 生态的话 grpc 真的不太好用😂
    RobberPhex
        12
    RobberPhex  
       Feb 24, 2021
    虽然题主限定了“无需声明格式”,但是从回复来看,题主是要上微服务。

    那么我觉得还是用 dubbo 或者 grpc 这种成熟的序列化、rpc 方案比较好。
    选择一个技术其实是选择了它的生态,比如你在初期选择了 msgpack,那么后续的网关(比如网关的 session 粘滞)、mesh (解析协议内容),都需要选择支持 msgpack 的。初期的技术选型会极大地影响后续的选择。

    另外,基于 msgpack 自己做 rpc 框架(或者采用现有的),后续很多已有的坑都需要自己踩一遍(加班 N 小时 /天 /月),比如如何实现流式调用,如何实现 rpc 连接池,如何做监控等。从这一方面来说,dubbo 成熟度比 grpc 要高,官方的模块中包含了很多生产中用到的特性,而且 dubbo3 也会支持 grpc,也能享受到 grpc 的生态优势。

    总而言之,如果是自己研究,可以多看看一些序列化 /rpc 框架;如果是生产使用,还是看下业界的流行方案。
    abersheeran
        13
    abersheeran  
    OP
       Feb 24, 2021
    @so1n HTTP 层我没有实现,这个可以用 Python 社区的一些解决方案上 2 甚至 3 来提速。grpc 不也是 HTTP2 的嘛。

    @RobberPhex 这些我都思考过,选择 HTTP 而不是 TCP/UDP 自定义协议,就是因为你说的这些在 HTTP 上都有很成熟的解决方案,不需要我自己弄。我唯一需要自己处理的就是 HTTP body 的序列化罢了。
    hj24
        14
    hj24  
       Feb 24, 2021 via iPhone
    你们上微服务后有跨语言的需求吗
    luozic
        15
    luozic  
       Feb 24, 2021
    rsocket 上面可以传输 json grpc 也对于 graphql 还可以自己定义,https://github.com/rsocket/rsocket
    abersheeran
        16
    abersheeran  
    OP
       Feb 24, 2021
    @luozic 抱歉,阿里的开源项目,我不会用的。
    luozic
        17
    luozic  
       Feb 24, 2021 via iPhone
    @abersheeran 奈飞捐赠给开源的,什么时候成阿里的了? graphql 也是 Facebook 的。
    abersheeran
        18
    abersheeran  
    OP
       Feb 24, 2021
    @luozic 不好意思,下午看的比较急,看到最近一次 commit 是阿里的人就先入为主了。现在下班了,我再仔细看看。
    lesismal
        19
    lesismal  
       Feb 24, 2021
    你们用啥语言,如果是 golang,欢迎尝试我这个

    https://github.com/lesismal/arpc
    lesismal
        20
    lesismal  
       Feb 24, 2021
    msgpack 挺好的,数据量比 json 省一点,比 pb 多,但是方便,基本够用了
    silymore
        21
    silymore  
       Feb 25, 2021 via iPhone
    @luozic dubbo 是阿里的
    LeeReamond
        22
    LeeReamond  
       Feb 25, 2021 via Android
    说个题外话,lz 考虑过压缩 io 流吗,最近发现压缩可以有效缩减传输量
    LeeReamond
        23
    LeeReamond  
       Feb 25, 2021 via Android
    另外 lz 测试过基于 http 相对 tcp 构建的效率吗。我之前测试本地回环,进程间 socket 通信一个来回大概在 100 微秒这个数量级,http2 之类的协议是不是能达到类似效果?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2754 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    ♥ Do have faith in what you're doing.