关于时序数据流经Kafka之后可能产生乱序的原因和解决方法
博主最近在做数据迁移的工作,但是在迁移的过程中遇到了一个问题,数据总是无缘无故的丢失,而且我的日志也没有报任何的错误异常信息,后经过排查,flink在消费kafka的时候我是通过事件时间处理数据的,有水位线的概念,由于kafka中的数据有大量的乱序现象,而且乱序的时间也比较严重,虽然写入数据的工作不是博主做的,但是抱着求知的心态,还是差了一下是什么原因会导致kafka中的数据出现乱序。
kafka简介:Kafka 作为一个流行的消息队列,以分布式高性能,高可靠性等特点已经在多种场景下广泛使用。
但在实际部署过程中,可能会因为配置原因导致经过 Kafka 的数据在接收方产生乱序,给后续处理环节带来排序等工作,造成不必要的处理开销,降低系统的处理性能和额外排序的工作。
其实可以通过合理的规划设计 Kafka 的配置和方法来避免消息在通过 Kafka 后乱序的产生,只需要遵循以下原则即可:对于需要确保顺序的一条消息流,发送到同一个 partition 上去。
Kafka 可以在一个 topic 下设置多个 partition 来实现分布式和负载均衡,由同一 consumer group 下的不同 consumer 去消费;这样的机制能够支持多线程分布式的处理,带来高性能,但也带来了同一消息流走了不同路径的可能性,如果没有针对性的规划,从架构上就无法保证消息的顺序。如下图所示,对于同一个 topic 的一条消息流,写入不同的 partition,就会产生多条路径。
为了确保一条消息流的数据能够严格按照时间顺序被消费,则必须遵循一条路径的原则,这样才能实现 FIFO(First In First Out)。
根据 Kafka 的文档描述,把哪条记录发到哪个 partition,是由 producer 负责:
Producers
Producers publish data to the topics of t