Kafka技术
1、kafka分区机制
分区机制是kafka实现高吞吐的秘密武器,但这个武器用得不好的话也容易出问题,今天主要就来介绍分区的机制以及相关的部分配置。
首先,从数据组织形式来说,kafka有三层形式,kafka有多个主题,每个主题有多个分区,每个分区又有多条消息。
而每个分区可以分布到不同的机器上,这样一来,从服务端来说,分区可以实现高伸缩性,以及负载均衡,动态调节的能力。
当然多分区就意味着每条消息都难以按照顺序存储,那么是不是意味着这样的业务场景kafka就无能为力呢?不是的,最简单的做法可以使用单个主题,单个分区,所有消息自然都顺序写入到一个分区中,就跟顺序队列一样了。而复杂些的,还有其他办法,那就是使用按消息键,将需要顺序保存的消息存储的单独的分区,其他消息存储其他分区。
2、分区写入策略
所谓分区写入策略,即是生产者将数据写入到kafka主题后,kafka如何将数据分配到不同分区中的策略。常见的有三种策略,轮询策略,随机策略,和按键保存策略。其中轮询策略是默认的分区策略,而随机策略则是较老版本的分区策略,不过由于其分配的均衡性不如轮询策略,故而后来改成了轮询策略为默认策略
2.1、轮询策略
2.2随机策略
2.3按键保存策略
2.4kafka 的分区数设置
越多的分区可以提供更高的吞吐量、需要打开更多地文件句柄、会导致更高的不可用性、可能增加端对端的延迟、意味着需要客户端需要更多的内存
总结
通常情况下,kafka 集群中越多的 partition 会带来越高的吞吐量。但是,我们必须意识到集群的 partition 总量过大或者单个 broker 节点 partition 过多,都会对系统的可用性和消息延迟带来潜在的影响。未来,我们计划对这些限制进行一些改进,让 kafka 在分区数量方面变得更加可扩展。
3、kafka消息队列作用
3.1依赖解耦
3.2异步处理
串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端
并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间
假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒
3.3流量削锋
一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列可以控制活动的人数可以缓解短时间内高流量压垮应用
4、Kafka为什么高吞吐量
4.1顺序读写
kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能,顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写
4.2零拷贝
Kafka高吞吐量的原因其中有个重要技术就是Zero-Copy(零拷贝)系统调用机制。
传统的文件拷贝如下:
Kafka引入DMA(Direct Memory Access)直接内存访问,一种可以让某些硬件子系统可以直接访问系统主内存,而不用依赖CPU调度,传统的内存访问都需要经过CPU的调度来完成的
4.3分区
kafka中的topic中的内容可以被分为多个partition,每个partition又分为多段segment,所以每次操作都是针对一小部分做操作,很轻便,并且增加并行操作的能力
4.4批量发送
kafka允许进行批量发送消息,producer发送消息的时候,可以将消息缓存在本地,等到固定条件再发送到kafka
消息条数满足固定条数
一段时间发送一次数据压缩
4.5Kafka优化JVM GC
简单来讲,就是每个Batch底层都对应一块内存空间,这个内存空间就是专门用来存放写入进去的消息,当每一个Batch被发送到了kafka服务器买这Batch的数据不再需要了,就意味着这个Batch的内存空间不再使用了,此时这个Batch底层的内存空间不要交给JVM去垃圾回收,而是把这块内存空间放入一个缓冲池里,这个缓冲池里放了很多内存空间,下一个Batch可以直接从这个缓冲池获取一块内存空间,以此类推,循环往复
5、安装kafka
修改config目录下vi server.propertie文件
启动命令
./kafka-server-start.sh -daemon …/config/server.properties
6、springboot集成kafka
6.1引入jar包
org.springframework.kafka
spring-kafka
6.1生产者yml
6.2消费者yml
生成者代码
消费者代码
测试
请求参数
测试结果