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

系统架构设计求解惑

  •  
  •   Dogod37 · 125 天前 via Android · 2737 次点击
    这是一个创建于 125 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好。
    关于系统设计菜鸟求问
    背景:有一个业务系统,是 springboot 应用,大而全,所有业务功能都放在里面。
    想法:因为业务流程中有一些异步方法或是耗时很大的功能 /方法,想把这些功能剥离成一个单独的应用(会部署在同一个服务器上面),比如调用第三方服务发送短信,或是生成 Excel 、PDF 文件等。
    问题:这是不是可以用微服务这个概念来解决?或是就单纯地再起一个应用(大概率还是 Java),那主应用和这个新的基础服务应用应该用何种方式通讯呢? http 应该是不合适吧?
    25 条回复    2022-11-23 10:00:53 +08:00
    v2vTZ
        1
    v2vTZ  
       125 天前 via Android
    微服务包括服务间的调度和熔断,按照你的描述我觉得你单独搞个服务 HTTP 访问是最方便的,由内部业务变成网络请求
    xuanbg
        2
    xuanbg  
       125 天前
    微服务肯定比巨石要容易维护,但你这个问题和微服务没关系。异步方法就用异步的交互方式好了,至于把他们都硬捏到一块么?譬如你举的这几个例子,都可以前端轮询的方式去查结果啊。

    反正我导出 Excel 就是这样处理,服务端导出后上传文件到 OSS ,然后把文件的 url 写到数据库里面。前端查到 url ,就显示下载按钮。你看,这不是很简单?
    hamsterbase
        3
    hamsterbase  
       125 天前 via iPhone
    这种其实适合 serverless ,在 serverless 实现具体的业务逻辑。
    chenPiMeiHaoChi
        4
    chenPiMeiHaoChi  
       125 天前
    没啥不合适,springcloud 就是用的 http 。
    看你的描述应该不是什么大并发的需求,单独拆成 springboot 跑也没啥问题啊。
    darkengine
        5
    darkengine  
       125 天前
    上微服务是杀鸡用牛刀了,另外起一个用胶水语言写的提供发送短信、生成 excel 、PDF 等服务功能的服务,通过消息队列调用就好了。
    Aaronsunny
        6
    Aaronsunny  
       125 天前
    直接起各公共服务,http 调用就好了
    swulling
        7
    swulling  
       125 天前 via iPhone
    为啥要拆服务,是 Java 不支持多线程了么?

    就拆出一个单独的模块,然后 api 设计为异步,搞个线程池不就完了。

    坚决反对拆无必要模块的想法。
    swulling
        8
    swulling  
       125 天前 via iPhone
    坚决拥护单体应用 @
    Akitora
        9
    Akitora  
       125 天前
    CompletableFuture
    chendy
        10
    chendy  
       125 天前
    单独拉个模块,集中管理队列、线程池就够了
    除非有成熟团队,否则坚决反对拆项目
    coderxy
        11
    coderxy  
       125 天前
    你这个需求,搞个异步任务就行了
    wqhui
        12
    wqhui  
       125 天前
    微服务通讯本质也是互相发请求,http 虽然不是针对微服务这场景做的协议,但一般也够用了,如果并发特别大才要用 rpc ,太菜了还没遇到过瓶颈是因为通讯协议
    ericguo
        13
    ericguo  
       125 天前
    @coderxy 完全同意,只需要一个异步 /后台 任务系统。
    litchinn
        14
    litchinn  
       125 天前   ❤️ 1
    从描述上看

    > 会部署在同一个服务器上面

    这说明应用没有性能压力,只是由于异步且耗时较大所以想拆分。而微服务并不解决这个问题。

    > 大而全,所有业务功能都放在里面。

    这里我觉得想法应该是觉得这块异步的功能比较独立,想拆分出来让代码更好管理一点。这个没问题,但是像楼上说的代码层面单独拆出一个模块就好了。

    综上,从你的描述上看应该是不必拆分的。

    什么情况应该拆分了呢?
    ( ps: 将“生成 Excel 、PDF 这个块”简称模块 A )
    1. 模块 A 很占资源,长期占用大量内存、cpu ,以至于影响本来的业务。
    2. 模块 A 速度太慢,想并发执行,需要启动多个实例跑。
    拆分之后如何调用呢?
    1. 整体换成微服务架构,微服务提供完整的服务间调用、路由、限流等功能。
    2. 使用 mq 通讯即可。
    justRua
        15
    justRua  
       125 天前
    要明白服务切分的意义。例如隔离影响、方便服务扩展和加机器。
    justRua
        16
    justRua  
       125 天前
    如果流量不大属实没什么必要切分,分开后你要多处理各种异常情况,后续如果有新增什么复杂功能你可以提议新增一个服务避免影响旧服务。
    NizumaEiji
        17
    NizumaEiji  
       125 天前
    自己搞个线程池 异步跑一下就行
    当然有时间折腾分拆一个服务也可以
    jeesk
        18
    jeesk  
       125 天前
    RSocket Broker
    liujavamail
        19
    liujavamail  
       125 天前
    问个问题, 如果把项目拆分成多个功能独立的子服务,子服务可以独立部署,服务之间通过 http 或者 rpc 相互调用,没有 api 网关,没有服务注册与发现,只是单纯的拆分成多个服务,这样可以叫微服务吗?
    wolfie
        20
    wolfie  
       125 天前
    通讯方式 MQ 、Redis 、数据库 都行。

    异步任务类的,不建议直接请求。
    312ybj22
        21
    312ybj22  
       124 天前
    能拆就拆,早期拆分成本还会低点,不然一台服务挂了,全都 jgg , 通信的话,Http 或者 Mq 都行
    andreby
        22
    andreby  
       124 天前
    +1
    leoskey
        23
    leoskey  
       124 天前
    如果是生成 excel 、pdf 台占用服务器资源,可以拆分到单独服务
    如果是仅处理时间过长,应将业务使用后台任务处理
    Pony69
        24
    Pony69  
       120 天前
    没必要拆成微服务,直接内部 http 请求或者弄个线程池执行异步。
    dasvenxx
        25
    dasvenxx  
       120 天前
    上微服务的话 你的下个问题将是 《如何将微服务项目快速融合成单体项目》
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   4549 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 07:56 · PVG 15:56 · LAX 00:56 · JFK 03:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.