问几个关于微服务的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
m939594960
V2EX    问与答

问几个关于微服务的问题

  •  
  •   m939594960 2018-06-14 09:59:00 +08:00 3642 次点击
    这是一个创建于 2676 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.微服务的数据库事务方面到底怎么做比较好?因为是金融类的项目,事务很重要.

    2.微服务具体要怎么拆分,有没有什么开源的例子,或者相对来说实践知识比较多的文章或者视频,现在都是概念还是很困惑.

    3.例如:我下单有三个流程:创建订单,修改余额,减少库存, 也有对应的三个微服务,那么我是再写一个下单的服务,还是在网关控制顺序去调用这 3 个微服务,然后直接返回结果呢?

    最后问下有什么微服务相关的比较好的文章,视频,文章,感觉查到的都比较笼统,适合在现有微服务的情况下优化,而不是从头做微服务

    第 1 条附言    2018-06-14 23:43:41 +08:00
    不可能不拆的,

    修改余额这步,下单、充值、活动之类都设计,我总不可能每个服务都要单写一下修改余额,要是那样的话服务一多根本没办法维护好不?

    减少库存这步,无论是后台修改,前台下单,还有用户退货之类的,肯定都要有一套通用的服务去处理,总不可能每个地方写一套吧?


    还是我对微服务理解有问题?


    @sujin190 @Muninn @MiffyLiye
    22 条回复    2018-06-22 09:42:39 +08:00
    mfhh
        1
    mfhh  
       2018-06-14 10:12:00 +08:00   2
    耦合这么紧的三个流程我是不拆的。放到一个微服务里。
    keepongjl
        2
    keepongjl  
       2018-06-14 10:12:53 +08:00
    你问的这些东西,不是一两句能说清的吧
    sujin190
        3
    sujin190  
       2018-06-14 10:18:18 +08:00   1
    微服务本身界定的是独立功能独立服务吧,没说每个小操作单独封装,每个小操作独立封装完全是没经验的外行瞎传吧

    比如你刚才的,应该是两个微服务,下单和支付,创建订单和减少库存只属于下单功能的,修改余额只属于支付功能的,电商类来说下单成功但支付失败本身就是可接受的事情,只需要容错就行,不需要事务的吧

    当然如果你这三个必须在同一个事务中操作,那么最好就是一个是一个微服务提供的完整功能

    微服务想做事务除了两步提交,似乎也没有什么好的方法了吧,先请求一次所有微服务组件加载验证开数据库事务,再请求提交修改,但是似乎也没办法规避提交过程中又失败的情况
    luffysup
        4
    luffysup  
       2018-06-14 10:19:49 +08:00
    说的是啥 spring boot/cloud?
    m939594960
        5
    m939594960  
    OP
       2018-06-14 10:26:14 +08:00
    @keepongjl 我就想知道一个大概的概念,细节我可以自己了解.
    Muninn
        6
    Muninn  
       2018-06-14 11:14:39 +08:00
    不要强拆。

    楼主说的订单,余额,库存。 小点的系统一般是一起的。 但是如果很大,像京东那样,那很可能是需要分开的。
    但是来这里问的我估计业务量不大,所以说不要强拆。

    尤其是必须要走事务的,那就乖乖的放一个服务里走事务吧。

    如果非要拆怎么做呢? 事件驱动了解一下。
    需要一个可靠性很高的队列。然后还要写补偿机制,不好补偿了还需要产品流程配合。
    jjianwen68
        7
    jjianwen68  
       2018-06-14 11:28:26 +08:00
    也不要太微吧,过犹不及
    FinalDream
        8
    FinalDream  
       2018-06-14 11:39:53 +08:00
    说这几个在一个服务的不合适吧,库存的管理明显和商品属于一套的,下单肯定是要耦合多个服务的,这两大块都不拆开还是用单体架构更合适一些。

    一致性无非就是那几种,2PC,3PC,最终一致性
    alangz
        9
    alangz  
       2018-06-14 11:51:49 +08:00
    第一,并不是任何公司业务都适合微服务,这个你要权衡,不要让以后痛苦;
    第二,所谓微服务只是一种架构风格,现在没有一个标准,都是根据自己的业务场景和理解去实践的;
    第三,微服务架构本身就是一个分布式系统,若你多个服务的操作需要在一个事务中这就可能涉及到分布式事务;
    第四,目前普遍认为 Netflix 对微服务实践做的比较好,在 Java 的生态当中目前相关的组件他们都有开源,包括现在 spring cloud 很多组件都是他们的,因此你可以去看看他们的博客;
    MiffyLiye
        10
    MiffyLiye  
       2018-06-14 12:46:36 +08:00
    需要保持强一致性的业务只能放在同一个服务里,业务量小的时候问题不大。

    业务量大的时候一般选择保 Availability,牺牲强一致性,只要求最终一致性。
    例如,订单服务创建订单,但订单初始状态标记为待支付,然后
    a. 通过可靠的途径发送消息(可重发,不可少发),余额服务收到消息后修改余额,...
    或 b. 余额服务定期请求订单服务,查询待支付订单,然后处理,...
    或 c. ...
    余额服务处理完后通过可靠的方式通知订单服务处理成功或失败,订单服务将订单状态改为待发货或扣款失败(并通知其他服务“回滚”)。
    与库存服务的交互也类似。

    整个过程完全异步化,服务间只能保证最终一致性,要处理的各种异常(主要是网络异常)也变多,但是可以提升 Availability,系统的可维护性也可能会提高。
    m939594960
        11
    m939594960  
    OP
       2018-06-14 23:37:08 +08:00
    @Muninn 我觉得这三个要是不拆分的话,微服务就没啥意义了,因为那么多涉及到动余额的服务,我总不能每个程序里单独写一份修改余额把,那么多要修改库存的服务,我总不能每个程序里单独写一份修改库存吧。
    如果要是那样的话怎么应对需求的变更,例如对余额操作要加缓存、插入日志表之类的操作我总不能在每个服务中都进行一次修改吧,那样的话工作量会成百倍的增加
    m939594960
        12
    m939594960  
    OP
       2018-06-14 23:39:07 +08:00
    @mfhh 不可能不拆的,修改余额这步,下单、充值、活动之类都设计,我总不可能每个服务都要单写一下修改余额,要是那样的话服务一多根本没办法维护好不?
    mfhh
        13
    mfhh  
       2018-06-15 09:36:25 +08:00
    @m939594960 如果你业务小,拆服务带来的复杂度比放在一个原子事务里单独写要高的多,拆了不合算。不太了解楼主说每个程序里单独写一份修改余额的问题在哪里?如果只是代码复用,可以做成公用库。
    troywinter
        14
    troywinter  
       2018-06-15 10:08:29 +08:00
    微服务做分布式事务用两步提交是最差的方法,具体可以看 manning 出版的 microservice patterns,微服务的分布式事务一般是用 saga pattern 来做,这也是 netflix 实践过的比较成功的方案。
    m939594960
        15
    m939594960  
    OP
       2018-06-15 12:59:13 +08:00
    @troywinter 恩,我查查,十分感谢.
    Muninn
        16
    Muninn  
       2018-06-15 23:16:49 +08:00   1
    我觉得业务量小的时候,可以只要做个状态检查就行了。 比如库存可以为负,每当为负的时候就在控制台提示,啊,sb 了,快去给客户道歉取消订单吧。。

    然后要是经常出现,可以做一个显示的库存,再做一个真实的库存,比显示库存多几件当做容错。 一个数据库操作就几毫秒,性能不好点的,算几十毫秒。 这个碰撞的概率还是很小的。
    只要不做抢购秒杀什么的,不会有问题。

    秒杀的业务逻辑经常需要特殊处理,比如秒杀完了不是立刻给结果的,等会才给结果。。
    m939594960
        17
    m939594960  
    OP
       2018-06-20 10:11:45 +08:00
    @Muninn 我觉得你这个思想很危险,做程序要做保证不能出错,而不是出错的几率比较小. 很多不可控的东西,会无线放大这些错误.
    Muninn
        18
    Muninn  
       2018-06-20 14:24:21 +08:00
    @m939594960 哈哈 危险的是你这种追求完美的想法。

    程序不可能不出错,随着业务量和并发的上涨,各种地方都会出问题。

    你一万块可能就能做出来个和京东一模一样的站,但是你承载不了那么多用户。

    所有的创业企业,一开始的 app 都是从几千几万的投入开始的。但是发展大了以后,累计投入可能会有几个亿。

    而你的思想,是东西还没有卖出去一件,就想做一个别人投入几个亿做出来的可靠性的东西。

    记住,能被预见的并能提示你的出错不叫出错,它只是一个业务上需要处理的异常。
    m939594960
        19
    m939594960  
    OP
       2018-06-20 23:15:22 +08:00
    @Muninn 我十分反对你这种思想,当然会出问题,但是出的问题一定是想到可能会发生的,做好可能会发生的问题的预测与准备,而不是到一定量一定会发生的,然后就去调整所谓的逻辑,去避免这个问题。 你想想如果京东淘宝这类东西,为了避免秒杀并发过大容易超卖只有充值一万的会员 才能进行秒杀,那么这个项目能做到这么大么?技术是为业务服务的,而不是业务为了技术服务。
    Muninn
        20
    Muninn  
       2018-06-21 17:42:30 +08:00
    无法交流, 希望你能学会优先去理解别人的表达,确认理解了后再攻击。
    m939594960
        21
    m939594960  
    OP
       2018-06-21 21:22:41 +08:00
    @Muninn
    其实都不想跟你说这么多。
    1.你知道微服务是什么么?
    2.事务和状态检查有啥关系? 我要用事务就是为了不超卖?
    3.当库存为负的时候给客户道歉??然后要是经常出现????? 我真不知道作为一个程序员如何的不要脸才能跟运营说这种话
    4.性能不好点的,算几十毫秒。 这个碰撞的概率还是很小的? 你知道运营会怎么运营这个东西么?你知道商品并发购买的数量有多少么? 我告诉你我做的项目虽然不大,但是有些火的商品不去做控制想要一下超卖十几个还是太简单了。
    5.如果你的程序测试一压就超卖了,还能上线? 就算我去做个 2000 块的外包,也不可能让他那么容易就超卖

    还是。。。。你只是单纯的想给我讲一下库存的容错???
    Muninn
        22
    Muninn  
       2018-06-22 09:42:39 +08:00
    年轻人,火气不要那么大。
    我是工作了十几年的架构师,2015 年之后的生产项目都用的微服务架构。在你还在学校研究 js 和 php 的时候,我已经把英文的微服务资料看了很多遍了。当然这三年微服务也一直在进化,我也持续的在看新的技术演进。
    你问的问题很普遍,去用英文搜一下到处都是答案。

    我只是怕你不懂,给你个最终一致性的补偿模式的最简单的例子,结果你还是不懂。你确定你不需要先好好再去补补课吗?

    你想追求完美,给你个详细点的方案把,叫 tcc 模式。
    http://www.grahamlea.com/2016/08/distributed-transactions-microservices-icebergs/

    好好学习,别总想着攻击别人。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6050 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:37 PVG 10:37 LAX 19:37 JFK 22:37
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86