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

单体服务中,模块之间相互调用怎么优雅地实现?

  •  
  •   gosky · 127 天前 · 1320 次点击
    这是一个创建于 127 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前都是写微服务,单体服务还真就不怎么会写

    两个模块:商品和订单
    眼下有这么两个流程:
    一、用户下单:创建虚拟商品,创建订单。
    二、用户支付:订单状态更新为已支付,虚拟商品出库。

    注意:
    一、要符合模块自治的要求。商品的操作在商品模块实现,订单的操作在订单模块实现
    二、整个流程,要么全部成功或失败,要么支持回滚

    如果是微服务,可由上层服务组合这些操作,也大概率会有一个可以重试的消息队列。
    但现在是单体服务,还没有消息队列
    6 条回复    2024-07-17 10:44:18 +08:00
    haoz1w0w
        1
    haoz1w0w  
       127 天前
    单体服务直接用事务不就行了
    dzdh
        2
    dzdh  
       127 天前
    抽个中间逻辑层 负责混合调用两个
    Akitora
        3
    Akitora  
       127 天前
    再加一层
    gosky
        4
    gosky  
    OP
       127 天前
    @dzdh
    @Akitora
    加一层,等于整个单体服务的结构加了一个维度
    而这类情况只是属于少数

    我想到另一种可能,加一个和商品模块、订单模块平级的 商品订单混合模块,由商品订单混合模块去调平级的两个模块。只是还从没这么干过……
    nothingistrue
        5
    nothingistrue  
       127 天前
    把你的微服务怎么实现最终一致性的,搞清楚就可以了,没必要往外面找。「微服务」、「单体当中严格分离的模块」,这俩概念,在设计层面上,本来就是同一个。
    dzdh
        6
    dzdh  
       127 天前
    @gosky

    商品管理

    product.add / remove / update

    订单管理

    order.new / update / query

    下单逻辑层 (同级)

    orderlogic.neworder : order.new(product.id, num,price) product.update(stock-1)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2734 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:14 · PVG 23:14 · LAX 07:14 · JFK 10:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.