• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ak1ak
V2EX  ›  程序员

如何正确处理大批量数据的业务

  •  
  •   ak1ak · Feb 9, 2023 · 3200 views
    This topic created in 1363 days ago, the information mentioned may be changed or developed.

    Hello, all!

    数据库中有一大批待处理的数据,可能有百万量级,还会增长。希望定义一个接口,请求之后查询并处理好这些数据。 处理的逻辑可能涉及 RPC 之类耗时较长的代码。因此,我使用异步代码处理。伪代码如下:

    // 1.查询数据库
    List<Biz> bizs = queryDB();
    // 2.分批次
    List<List<Biz>> bizLists = Lists.partition(bizs, 1000);
    // 3.异步处理 list
    bizLists.forEach(list -> listAsyncService.handle(list));
    // 4.listAsyncService#handle 也是异步处理
    list.forEach(biz -> asyncService.handle(biz));
    

    请教一下,上述代码是否合理。在数据量很大的情况下,如何避免步骤 1 出现 OOM 。

    11 replies  •  2023-02-09 11:09:02 +08:00
    keenkiller
    keenkiller
    Feb 9, 2023
    1
    你这个应该用 rabbitmq 之类的做异步,长时间运行的流程靠开线程异步不靠谱,除非调用方能容忍失败。

    如果害怕第一步 OOM ,那你直接在第一步分页查数据库不就完了…
    ak1ak
    ak1ak
    OP
    Feb 9, 2023
    2
    在主键为 id 的情况下,每次查询记录 min(id),并针对 min(id) 分页只处理部份数据,如 10000 条。SQL 这样写:

    ```sql
    select * from tb_biz where id > (select min(id) from tb_biz where 查询条件) and 查询条件 limit 10000
    ```

    这样的话,就需要多请求几次接口。
    ak1ak
    ak1ak
    OP
    Feb 9, 2023
    3
    @tairan2006 这个业务的场景是处理一些历史数据,接口是提供给内部人员调用的。希望尽可能一次性处理比较多的数据,调用者不乐意传分页参数,只希望分页逻辑在后台做掉。
    NoString
    NoString
    Feb 9, 2023
    4
    调用者不传你自己加分页,写个方法
    queryMinLimitData(Long minId,int limitCount)
    嫌慢多线程调这个方法
    imokkkk
    imokkkk
    Feb 9, 2023
    5
    1 查完之后推给 MQ ,2 从 MQ 拉取到数据后再分成小批次交给线程池多线程去处理
    5boy
    5boy
    Feb 9, 2023
    6
    楼上回复分页查的一看就是菜鸟。分页查完汇总不还是这么多数据吗?数据又不会少,还是会 oom
    ponder09
    ponder09
    Feb 9, 2023
    7
    就是分页查询 然后发送到 MQ ,查一批发一批,内存占用转移到 MQ 中去,然后多开消费者按需消费 MQ 的数据。
    zzzzz001
    zzzzz001
    Feb 9, 2023
    8
    简单点,在表里面加个同步字段,每次同步了就更新这条数据,你每次用 limit 1000 取 1000 条未同步的,无限循环下去,当没有返回就终止循环
    zzzzz001
    zzzzz001
    Feb 9, 2023
    9
    @zzzzz001 这种方式我玩了很多次了
    beneo
    beneo
    Feb 9, 2023
    10
    spring batch
    Juszoe
    Juszoe
    Feb 9, 2023
    11
    使用数据流中间件
    我没用过,不负责任推荐 https://github.com/mage-ai/mage-ai
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5008 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:56 · PVG 16:56 · LAX 00:56 · JFK 03:56
    ♥ Do have faith in what you're doing.