V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chanlk
V2EX  ›  程序员

不同子系统间如何优雅地传递消息

  •  
  •   chanlk · 2021-11-23 14:40:03 +08:00 · 2448 次点击
    这是一个创建于 856 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有四个子系统,每个子系统的用的技术都不一样

    1. 一个有十几个 dubbo 子模块的业务系统,模块间可以相互调用;
    2. 由五六个 C++、Go 流媒体模块组成的流媒体系统;
    3. 一个新的 IOT 系统,单体的,java 写的;
    4. 三四个传统 java 模块,单体的;

    几个系统之间经常需要相互调用或者传递消息,现在是通过 HTTP 调用的方式,很笨重,开发效率低,也容易出 BUG ; 有什么更好的方式吗?

    现在每个子系统的资源都是隔离的,如数据库,redis ,es 这些都是每个子系统独有的,不能相互访问;

    18 条回复    2021-11-24 09:42:19 +08:00
    thevita
        1
    thevita  
       2021-11-23 14:43:44 +08:00
    需要解决 HTTP 不好维护的问题=rpc
    rekulas
        2
    rekulas  
       2021-11-23 14:43:58 +08:00
    rpc?
    Egfly
        3
    Egfly  
       2021-11-23 14:44:52 +08:00
    rpc+1
    ahhui
        4
    ahhui  
       2021-11-23 14:45:20 +08:00
    个人感觉,从技术上说,http 并不是不合适的选择,你这语言横跨很多个系统,必须要有一个通用的数据传输协议,至于搭载的载体,可以忽略不记。既然如此,http 就不是关键点,而是你使用的调用通讯协议。比如,如果是以 json 为数据传输载体,则不仅 http 可行,pipe ( win 系统下的),SharedMemory (同计算机上的),都可以实现。不同组件之间只关心 json ,至于怎么收发,则可以是另外一套接口来完成了。
    pi1ot
        5
    pi1ot  
       2021-11-23 14:47:10 +08:00
    我听起来 HTTP 就是比较恰当的选择
    lichao
        6
    lichao  
       2021-11-23 14:54:33 +08:00
    为什么不用 MQ ?
    chanlk
        7
    chanlk  
    OP
       2021-11-23 14:55:59 +08:00
    统一回复 rpc 的老哥们;
    rpc 在其中的一个子模块里用到了,里面十几个模块都可以相互调用;
    不同语言间的 rpc 我看了下不太好弄;
    而且在之前的架构设计上就把这几个子系统做得很独立,rpc 会耦合起来(也许是我 rpc 用得不太对);
    因为也有多地部署的需求,像流媒体系统这种;
    fuchaofather
        8
    fuchaofather  
       2021-11-23 14:56:36 +08:00
    RPC + MQ
    clf
        9
    clf  
       2021-11-23 14:58:51 +08:00
    RPC.

    或者弄个 MQ 作为总线一样的存在,通过监听 MQ 来实现相互调用(要处理重复调用、异步、消息丢失等问题)
    iam286
        10
    iam286  
       2021-11-23 14:59:49 +08:00
    用 RabbitMQ
    chanlk
        11
    chanlk  
    OP
       2021-11-23 15:03:13 +08:00
    其实好像也不是什么难题,用 MQ 就好,难的是推动各个模块的同事去一起做
    ipwx
        12
    ipwx  
       2021-11-23 15:03:33 +08:00
    http 其实挺香的。

    其次就是大一点的 mq 项目,不过那种项目其实更看重并发,写起来蛋疼。

    综上所述 http 其实挺香的。
    devswork
        13
    devswork  
       2021-11-23 15:34:19 +08:00
    我这各个系统之间用的就是 http+RabbitMQ 。各个系统都是独立的,资源也是独立的,需求天天改天天变,开发人员少,所以写不成微服务
    ospider
        14
    ospider  
       2021-11-23 15:37:15 +08:00
    swagger 用上了么?
    chanlk
        15
    chanlk  
    OP
       2021-11-23 17:59:01 +08:00
    @ospider 用了,接口多了没这种会疯的
    abcysn
        16
    abcysn  
       2021-11-23 18:38:08 +08:00
    grpc 不挺好的吗,各种语言都支持,定义一套 proto 文件,比 http 严谨,不容易出错,编译型语言哪个字段或传值类型错了编译时就能报错,还能 stream 调用
    dayeye2006199
        17
    dayeye2006199  
       2021-11-24 02:28:42 +08:00   ❤️ 2
    可以上 proto+grpc

    > 不同语言间的 rpc 我看了下不太好弄;
    这个是 proto 强项,定义文件编译各种语言

    > 而且在之前的架构设计上就把这几个子系统做得很独立,rpc 会耦合起来(也许是我 rpc 用得不太对);
    需要把交换的数据格式和暴露的接口定义出来;具体实现各个系统独立,不会耦合


    > 因为也有多地部署的需求,像流媒体系统这种;
    grpc 还支持流式传输;多地部署你需要配合服务网格或者 load balancer 这样的设施使用
    Itoktsnhc
        18
    Itoktsnhc  
       2021-11-24 09:42:19 +08:00
    emmm 我觉得 rpc 还是 http 这个可能不是重点?
    > 很笨重,开发效率低,也容易出 BUG
    rpc 还是 http 无非就是协议,感觉重点应该在各个不同系统之间 payload 的定义如何管理,保证各个系统都能遵守对应 payload 的 scheme ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3265 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:02 · PVG 20:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.