如何高可用的将大量数据通过kafka的读出来并进行处理

先说一点,因为项目原因需要对大量数据进行处理,有一个要求就是在5秒中之内将120w条数据推送到第三方app,怎么理解呢,就是说每5秒中我可能要产生120w条数据,这些产生的数据需要发送到第三方app指定的接口上,保证数据能够到达app端进行处理,这个app端不是指前端,可能是别人第三方的后台服务接口,这些接口拿到这些数据怎么处理是第三方app的事情,我们要做的事情就是要保证这么多的数据能够传输成功。

先来说思路:

面对每秒钟20万的数据量,要存储这么大的数据量,就很困难,所以,这些数据的存储我们选择用kafka进行临时存储,然后通过消费者将这些数据发给第三方app。至于kafka如何配置运用,建议直接去看学习资料了解。因为kafka的读写都是非常快的,所以这样的数据量完全不用担心。

关于kafka中消费者从读取数据的效率,根据实际测试,如果只是将数据读取出来,不做任何处理的话,大概每5秒种能够读取数据在30多万,所以为了达到要求,方法就是增加消费者集群,也就是消费服务多布置在几台服务器上,这样增加了横向扩展之后呢,也就能满足这样要求了,同时我们是三个kafka集群,服务消费者最多给到8台服务器,所以最多给你8台服务器,看似现在满足要求轻而易举了,实际不然,因为这时候的效率是没有包含处理和向第三方app发送的要求的。所以这时候的效率其实偏高,再加上虽然8台,但其实最多只能有7台,还有一台还要干其他事。因为我不负责kafka生产端,所以这块我也不能细说,反正kafka中能够生产出这么多的数据,我这边要干的只是要满足要求消费掉这些数据。

先说这个30多万怎么测出来的,因为大家都知道kafka的消费者在java中的写法是针对每个topic都创建一个线程去处理,每个线程都是一个死循环,然后再这个死循环中,循环通过poll方法读取kafka数据,kafka默认单次poll出来是500条数据。读出来的数据量用一个静态变量进行记录,然后通过定时任务每秒统计然后清零,因为生产那边的生产效率是这么多,所以消费者这边会受到生产者那边生产速度的限制,但是这样的读取效率已经能满足要求了。这是单台服务器测出的数据。

但是将数据处理之后加上向第三方app发送数据后性能降到了每5秒18万,这样的效率勉强满足,但是不够,万一服务器一个挂了怎么办。然后通过查看代码,发现这个从kafka消费和向第三方app发送的操作在同一个线程之中,这样的话,每次读取数据必须等整个流程执行完才能进行下一次读取处理。于是我们想到了读发分离,将读取和发送这两个操作分开来进行处理,这样不就提高效率了么,这么处理过后呢,你根本不用担心读的问题,因为已经说了,读都在30多万,我们要关心的是发操作。如何将这些数据发送出去呢。说一下,这些数据被读取出来后,存放在一个阻塞队列之中。

我们要做的就是从这个队列中去把数据读出来然后发送就可以了。所以发送方同样的,利用线程池创建多个线程,每个线程里面都是死循环,通过循环的去读取队列里面是否有数据,有数据,就poll读出来进行发送到第三方app。发送到第三方app用的httpclient发送的,这个不用担心,只要网络正常,我这里模拟测试了一下数据,80到90万每5秒时没问题的。最终测试在多线程下实现了每5秒27万的发送,远远满足要求。

 然后通过查看cpu占用率,发现在250%左右,也满足要求,因为上面给的是300%一下,3个核心。

所以总结一下:多集群、多线程、阻塞队列。

通过一个阻塞队列保存读取出来的数据,通过多线程方式从队列中读取数据并处理发送。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值