核心思路是减少网络往返次数(rtt)和单次传输的系统开销,关键在于“怎么发”——将零散请求攒批、每次通信干更多活;优先使用服务端支持的批量接口,如批量http、jdbc batch、grpc streaming,并配合连接复用、内存攒批、高效序列化等手段优化。

核心思路是减少网络往返次数(RTT)和单次传输的系统开销,而不是单纯追求“更快发完”。关键不在数据本身多大,而在“怎么发”——把零散请求攒成批、让每次通信干更多活。
用批量请求替代逐条调用
HTTP 接口、数据库写入、RPC 调用等,只要服务端支持批量接口,就应优先使用。例如:
- 不调用
/api/user/1、/api/user/2……100 次,改用POST /api/users/batch一次性传 100 个用户数据 - JDBC 中启用
addBatch()+executeBatch(),将 100 条 INSERT 合并为 1 次网络包发送 - 调用 gRPC 时,避免单消息流,改用 streaming RPC 批量推送数据块
调整缓冲与连接参数
底层 TCP 和 HTTP 客户端的行为直接影响批量效率:
- 增大 Socket 发送缓冲区(
SO_SNDBUF),让应用层 write 更快返回,内核自动聚合小包 - 启用 HTTP 连接复用(Keep-Alive),避免每批请求都重建 TCP 连接;设置合理最大空闲连接数和超时
- 对高吞吐场景,可调大 HTTP 客户端的连接池大小(如 OkHttp 的
ConnectionPool),防止批量请求排队等待连接
结合内存队列做客户端侧批量攒取
当无法修改服务端接口时,可在客户端加一层“攒批”逻辑:
- 用
BlockingQueue缓存待发请求,消费者线程定期用drainTo()一次性取出最多 N 条,组装后发出 - 配合轻量休眠(如
LockSupport.parkNanos(100_000))避免忙等,平衡延迟与吞吐 - 注意控制队列容量和超时丢弃策略,防止内存积压或请求过期
善用零拷贝与高效序列化
批量数据本身传输成本也不容忽视:
- 避免 JSON 字符串拼接,改用 Protobuf 或 FlatBuffers 序列化,体积更小、解析更快
- 大文件或二进制批量传输时,优先使用 NIO
FileChannel.transferTo()或AsynchronousSocketChannel,减少用户态/内核态拷贝 - 若用 Arrow Flight 等现代协议,直接利用其列式内存布局和零拷贝特性,PB 级数据也能高效流动
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











