Spring Batch分页导致Kafka出现重复条目问题排查
Spring Batch分页读取数据到Kafka出现重复条目的原因分析
未指定排序规则导致分页逻辑不稳定
JPA分页查询如果没有指定明确的排序字段(比如主键ID这类唯一标识字段),数据库无法保证每次分页返回的结果顺序一致。当表内数据有新增、更新或删除操作时,不同批次的分页查询很容易出现数据重叠——比如前一页的部分数据会在下一页再次出现。尤其你这里page size设为10,chunk size是5000,一个chunk需要读取500次分页,这种顺序不一致的问题会被放大,最终导致重复数据被发送到Kafka。Chunk size与Page size不匹配放大重复风险
Spring Batch的JpaPagingItemReader会逐页读取数据,累积到chunk size后再统一处理(发送到Kafka)。如果没有稳定的排序规则,在多次分页读取的过程中,数据顺序发生变化,同一个数据可能被多个page读取到,最终进入同一个chunk或不同chunk,造成重复发送。比如某次读取page1时包含数据A,读取page2时因数据顺序变动,A又被包含进来,最终就会出现重复条目。批量读取过程中的数据变更引发偏移
在批量任务执行期间,如果有其他线程或进程对目标表进行插入、更新(比如修改了会影响数据库默认排序的字段)或删除操作,会打乱结果集的原有顺序。没有指定排序规则的分页查询,会因为这种变更导致后续分页读取到已经处理过的数据,进而产生重复。
内容的提问来源于stack exchange,提问作者Sajeesh Murali
相关产品推荐
相关产品推荐

