kafka顺序消费的一些问题和心得

记录一下最近遇到的一个问题

问题描述

业务要求: kafka上的消息要求顺序消费,且为了保证顺序在生产消息时也是顺序的投放到一个分区中.

一开始写的很简单,既然一个分区还要求顺序消费,那我就单线程消费呗,一个消费者消费一个分区单线程肯定是顺序的,刚开始也确实没有问题,但是运行一段时间后出现了问题.

接入生产环境数据后,kafka数据量突然上升一个量级,大概每天有接近1千万左右的数据,由于我们的消费者里还有一些业务逻辑,所以其实每条数据消费速度并不是很快,这样就导致了千万级的数据消费不过来,出现了消息堆积,经过1个月的消费堆积,kafak上大概堆积了有2百万的数据,极大的影响了业务正常运行.

优化过程

然后就尝试了很多的优化方法,包括从业务/程序上优化,过滤一部分无效数据,但是效果并不明显.仍然有大量数据堆积.

后来经过一段事件的思考,突然有了一个新的想法: 二次投递

思路是这样的:

业务数据要求顺序,但是也可以将业务数据划分为N类,某一类的数据内保持顺序,这样的话我就启一个单线程消费者消费源端数据,在这个消费者内部将业务数据根据类型划分,投递到不同的分区,然后再根据分区数量启动N个消费者,每个消费者消费一个分区的数据,这样就把数据分散到多个消费者,且保证了数据的顺序性.

总结

kafka分区就是为了提高读写速度,放弃了顺序性,只能在分区内部保证数据的顺序性,所以遇到顺序消费的数据,只能在分区内部消费处理.

但是为了提高消费速度,可以考虑上面这种方式,这种方式的缺点就是会多存储一份数据,并且要求数据从业务上可以划分



上一篇:Linux下的多进程编程初步


下一篇:云原生(6)-k8s入门必看篇