You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot项目中如何优化Apache Camel路由提升批量数据处理速度

问题描述

我正在开发一个Spring Boot服务,该服务接收ID列表后会逐个从数据库查询对应对象,将这些对象聚合成批次后保存到其他存储位置。目前聚合后的批次大小约为50个对象,流入聚合路由的速度约为每秒10个对象,我需要找到性能瓶颈并提升整体路由处理速度。

原始代码

并发请求发送Bean代码

@Produce(uri = "direct:findObject")
private ProducerTemplate producerTemplate;

public void send() {
    List<Long> listOfIDs = someService.getIDList(); // 列表包含100万个ID
    listOfIDs.parallelStream().forEach(producerTemplate::sendBody);
}

原始Camel路由定义

from(direct:findObject)
        .bean(objectDaoBean)
        .marshal().json(JsonLibrary.Gson, MyObject.class)
        .to("direct:aggregator");

from("direct:aggregator")
        .unmarshal().json(JsonLibrary.Gson, MyObject.class)
        .aggregate(constant(true), new GroupedBodyAggregationStrategy())
        .parallelProcessing()
        .completionInterval(TimeUnit.SECONDS.toMillis(5))
        .completionSize(1000)
        .marshal(new GsonDataFormat(new TypeToken<List<MyObject>>() {}.getType()))
        .to("direct:bulkSave");

from("direct:bulkSave")
        .unmarshal(new GsonDataFormat(new TypeToken<List<MyObject>>() {}.getType()))
        .bean(bulkSaveBean);

优化方案与效果

采纳优化方案后整体性能至少提升10倍,具体修改内容如下:

配置调整(application.properties)

camel.threadpool.pool-size=10
camel.threadpool.max-pool-size=400
camel.threadpool.max-queue-size=-1

更新后的生产者代码

@Produce("direct:splitter")
private ProducerTemplate producerTemplate;

public void sendList() {
    List<Long> listOfIDs = getIDList(); // 列表包含100万个ID
    producerTemplate.sendBody(listOfIDs);
}

修改后的Camel路由

from("direct:splitter")
        .split(body())
        .parallelProcessing()
        .bean(new DaoBean()) // 按ID从数据库查询对象
        .to("direct:aggregator");

from("direct:aggregator")
        .aggregate(body(), new GroupedBodyAggregationStrategy())
        .parallelProcessing()
        .completionInterval(TimeUnit.SECONDS.toMillis(5))
        .completionSize(1000)
        .to("direct:bulkSave");

from("direct:bulkSave")
        .bean(new SaveBean());

优化前后效果对比

优化前

整体执行时间至少需要数小时(从未等待到执行完成),日志输出如下:

Saving... Batch size 30
Saving... Batch size 45
Saving... Batch size 41
Saving... Batch size 53
Saving... Batch size 47
Saving... Batch size 50

优化后

性能大幅提升,日志输出如下:

Saving... Batch size 499
Saving... Batch size 1000
Saving... Batch size 401
Saving... Batch size 1000
Saving... Batch size 257
Saving... Batch size 1000

核心优化点

  • 砍掉冗余序列化开销:原始路由存在4次无意义的JSON序列化/反序列化操作,优化后全程在路由中传递Java对象,大幅降低CPU开销。
  • 优化消息发送逻辑:原始逻辑循环调用ProducerTemplate发送百万次单ID请求,单次调用的上下文开销累计极高,改成单次发送全量ID列表,通过Camel内置Split组件并行拆分处理,减少了大量框架层面的额外开销。
  • 适配IO密集型场景调整线程池:数据库查询属于IO密集型操作,调整Camel全局线程池参数,放大最大线程数到400,关闭队列限制,充分利用CPU等待IO的空窗期处理更多请求。
  • 简化聚合逻辑:去掉聚合前后不必要的序列化步骤,直接聚合Java对象后批量存储,降低聚合器的处理压力。

内容的提问来源于stack exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:24:03