后台管理系统导出数据拖死业务, 是否应该彻底分开两块系统? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leaderhyh
V2EX    Java

后台管理系统导出数据拖死业务, 是否应该彻底分开两块系统?

  •  
  •   leaderhyh 2020-06-01 20:15:00 +08:00 5386 次点击
    这是一个创建于 2008 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景如下:
    SpringCloud 全套, 数据库未分库,主从读写分离;

    网关进来根据 api 进 微信微服务 手机 app 微服务, 后台微服务 等, 由这些微服务调用底层的 订单微服务 会员微服务等来完成业务逻辑或者组装数据;

    现在后台微服务中的导出会员接口没有控制条数, 一下导出 30w+的会员数据(每个会员还要统计订单情况等), 导致会员微服务挂掉, 进而导致微信微服务无法获取会员信息,无法完成业务(业务要求可用性较高)

    我的疑问是: 底层的订单微服务 会员微服务等 是否应该拆成两, 一个给业务使用, 一个给后台管理系统使用, 且部署分开. 现在比如会员微服务下 MemberController 里面就既有后台增删改查的 又有业务上比如支付时扣减用户余额的, 是否拆开好一点(再次强调:业务要求可用性较高!)?求解答, 谢谢!
    snappyone
        1
    snappyone  
       2020-06-01 20:17:47 +08:00 via Android
    30 万分成每次 1000 条就好了
    matrix67
        2
    matrix67  
       2020-06-01 20:18:47 +08:00
    分页
    leaderhyh
        3
    leaderhyh  
    OP
       2020-06-01 20:22:18 +08:00
    @snappyone 导出可以做成异步的, 是目前的解决方案
    optional
        4
    optional  
       2020-06-01 20:26:13 +08:00
    再加一台 slave 为后台专用。
    leaderhyh
        5
    leaderhyh  
    OP
       2020-06-01 20:29:51 +08:00
    @optional 底层微服务也拆开吗?
    levelworm
        6
    levelworm  
       2020-06-01 20:36:33 +08:00 via Android
    说分页的未必合乎后台业务需求啊,有时候后台的确需要批量处理,你分页是方便你自己了,但是后台就得写脚本自己抓数据了。对我就这么干过。最好还是分开来,后台专门有台机器。
    Jooooooooo
        7
    Jooooooooo  
       2020-06-01 20:38:39 +08:00
    拆分数据库, 实时交易库和导出类的库分开

    然后再去优化业务
    857681664
        8
    857681664  
       2020-06-01 20:39:52 +08:00 via Android
    导出可以异步放消息队列里,用独立服务处理,我的想法是这样
    leaderhyh
        9
    leaderhyh  
    OP
       2020-06-01 20:45:35 +08:00 via Android
    @Jooooooooo 目前数据库不是痛点且架构师不想动数据库
    CoderGeek
        10
    CoderGeek  
       2020-06-01 20:54:20 +08:00
    运营与对外分离
    night98
        11
    night98  
       2020-06-01 20:55:10 +08:00
    可以起两个服务,但是可以使用分批写入的方式,一次读取一千条左右,写到文件中,参考 http://poi.apache.org/components/spreadsheet/how-to.html#sxssf
    如果说内存足够的话,只是说数据库容易被拖死的话,可以单独起一个从库专门用于后台管理系统的导出,然后使用 mysql 自带的 sql 导出到硬盘目录,再用服务器转移到对象存储等文件服务上面
    Jooooooooo
        12
    Jooooooooo  
       2020-06-01 22:01:16 +08:00
    @leaderhyh 不是动架构. 只需要多一个从库然后导出专门连这个从库就行.
    yeqizhang
        13
    yeqizhang  
       2020-06-01 22:11:41 +08:00
    数据库倒不用分离吧,毕竟后台系统不就是操作对外的一些数据。
    不针对你现在的问题来说,系统也最好分开两个系统部署不同的机器,这是前期规划没做好呀!
    arrow8899
        14
    arrow8899  
       2020-06-01 22:43:19 +08:00
    你这里的导出可以看做是一种报表业务吧,每次导出再去计算成本太大了。通常的做法是用流式处理框架 Flink,Strom 等实时汇总,把计算成本分摊到每一次业务处理上,导出的时候直接读取就行。
    namelosw
        15
    namelosw  
       2020-06-01 23:05:58 +08:00   1
    微服务挂掉,不用 SQL 全读到内存计算了?那假如你是因为内存计算卡死的话
    0. 看看能不能把内存计算变成 SQL query,如果不能看下面
    0. 看看能不能改成异步 Job,如果不能看下面
    1. 最简单的建议单独分微服务出去
    2. 如果分出去微服务接着发现数据库也是瓶颈,把数据库用 CDC 之类的弄一个同步,只用来做查询
    3. 再不行就 Flint 或者 Spark,这些是大量内存计算的正规军
    leaderhyh
        16
    leaderhyh  
    OP
       2020-06-01 23:42:26 +08:00
    @Jooooooooo 这个已经做了
    leaderhyh
        17
    leaderhyh  
    OP
       2020-06-01 23:44:09 +08:00
    @yeqizhang 设计阶段是有想过, 当时大家都说先简单做, 所以代码就都揉到一起了
    leaderhyh
        18
    leaderhyh  
    OP
       2020-06-01 23:45:53 +08:00
    @arrow8899 ecs 的预算都有点吃紧,暂时不考虑这块
    leaderhyh
        19
    leaderhyh  
    OP
       2020-06-01 23:47:08 +08:00
    @namelosw 嗯 所以现在的方案是改成异步的
    wangyzj
        20
    wangyzj  
       2020-06-01 23:57:47 +08:00
    微服务挂掉?
    内存炸了?
    少量多次吧
    neptuno
        21
    neptuno  
       2020-06-01 23:59:53 +08:00 via Android
    搞个从库
    coderabbit
        22
    coderabbit  
       2020-06-02 01:06:53 +08:00 via Android
    我 mysql 实时同步 mongo.50 万数据 20 秒左右导出。一点不拖累服务!
    aru
        23
    aru  
       2020-06-02 07:27:28 +08:00
    @leaderhyh 预算问题可以去每次动态申请一台抢占式实例去做这个事情,做完了就释放
    snappyone
        24
    snappyone  
       2020-06-02 07:50:38 +08:00 via Android
    @leaderhyh 不是异步,重点是不要一次拉 30 万条
    xuanbg
        25
    xuanbg  
       2020-06-02 08:39:18 +08:00
    可以按导出需求做个小小的数仓,然后从数仓导出数据就不会影响到业务,而且导出速度也能提升到毫秒级。
    ytmsdy
        26
    ytmsdy  
       2020-06-02 10:19:15 +08:00   1
    一次性导出 30w+的会员数量这个操作,应该是规避的高风险操作吧。
    毕竟一次性导出这么多数据,除了拿出去卖,我想不到还有什么场景会用到这么多数据。
    arthas2234
        27
    arthas2234  
       2020-06-02 10:42:59 +08:00
    你如果是需要频繁导出的话,最好单独做一张表用来保存这些数据,到时候直接查出来就行了
    zoharSoul
        28
    zoharSoul  
       2020-06-02 11:25:03 +08:00
    会员微服务挂掉 是什么意思?
    内存溢出了?
    EastLord
        29
    EastLord  
       2020-06-02 13:58:18 +08:00
    流式下载不行吗
    leaderhyh
        30
    leaderhyh  
    OP
       2020-06-02 19:24:26 +08:00
    @snappyone 是异步生成文件 生成时每次处理 2000 条
    leaderhyh
        31
    leaderhyh  
    OP
       2020-06-02 19:25:12 +08:00
    @leaderhyh 额, 我是指买 ecs 的钱, 这块预算不够
    leaderhyh
        32
    leaderhyh  
    OP
       2020-06-02 19:25:32 +08:00
    @aru 额, 我是指买 ecs 的钱, 这块预算不够
    leaderhyh
        33
    leaderhyh  
    OP
       2020-06-02 19:26:47 +08:00
    @EastLord 后面考虑 目前接触这块的人少且不熟练
    aru
        34
    aru  
       2020-06-02 21:01:58 +08:00
    @leaderhyh 我也是指这个。 去试算一下抢占式实例的价格,如果你的计算一天只作一次,每次 1 个小时以内,还是挺便宜的。
    leaderhyh
        35
    leaderhyh  
    OP
       2020-06-03 09:28:18 +08:00
    @aru ok 我去看看 thanks
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:01 PVG 09:01 LAX 17:01 JFK 20:01
    Do have faith in what you're doing.
    ubao msn 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