场景 mysql的数据-->通过canal-->发送到kafka-->mysql、hive

在做canal集成kafka的时候,发现一个问题,多分区的情况下,跨分区的数据消费是无序的。

这时候就会出现问题,如果消费端消费的更新日志在插入日志之前,就会因为数据缺失导致异常(这样的情况随着并发出现的概率会增大),所以,需要保证新增的日志和更新的日志是有序的被消费。

kafka发送数据是支持指定分区的,这时候,只要把同一个表的同一个主键的数据发到同一个分区即可(如果多数据库得加入数据库名)

分区定义如下:

private int partitionDefine(String keyToPartition) {
	if (keyToPartition == null) {
		return new Random().nextInt(numPartitions);
	} else {
		return Math.abs(keyToPartition.hashCode()) % numPartitions;
	}
}
传入的参数 tableName+主键

这样,消费到的数据就是有序的。不同的场景灵活运用即可。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐