【小笔记】一次kafka推送效率的优化

场景

定时任务从Hbase扫描到数据后,经过处理推送到kafka,但是推送效率很低,导致积压了几千万的数据在Hbase中没有推送出去。

分析

导致推送效率低一般有3个方面导致:

  • kafka的分区数太少
    由于kafka写数据是写入到分区中的,分区数越多,并行度约高,效率就越高。所以可以通过增加分区数来提高写入效率。但是分区改变会导致消费者间重新分配partition,有可能出现重复消费的情况。

  • 业务处理时间太长
    这个需要优化业务代码来解决了

  • 写线程数太少
    单线程发送消息的效率肯定很低了

解决

经过分析后发送消息慢的原因是线程数太少,只有一个线程在推数据。所以多加几个线程即可。但是由于是定时任务扫描hbase中的数据,当多个线程同时工作时,一定会出现重复扫描的情况,就会重复推送。所以只能使用分段处理的方式来优化。即先一次性scan到一部分数据(例如10万条),然后对这部分数据进行拆分为多个段,每段使用一个线程进行推送。

经过测试推送前约80条/秒,优化后约1万条/秒,并且随着数据量增长推送时间并不会增长的太多。

以上采用多线程的方式进行了优化,当数据量很大时,还可以多进程多线程的方式来处理,只是需要把hbase的数据拉到redis中进行分段后,由各个节点并行处理。

你可能感兴趣的:(小笔记,kafka)