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

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

  •  
  •   leaderhyh · 34 天前 · 2969 次点击
    这是一个创建于 34 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景如下:
    SpringCloud 全套, 数据库未分库,主从读写分离;

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

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

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

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