Kafka技术文案

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
在这里插入图片描述
生成者代码
在这里插入图片描述
消费者代码
在这里插入图片描述
测试
请求参数
在这里插入图片描述
测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第一章 需求 对方的网页文件接入到我方服务器。每个文件要知道其:网站、采集时间等。 通过消息队列将多个远程服务器上的【数据文件】源源不断的接入到本地服务器,数据文件是下载下来的网页,传输过来的时候还要带上来自的网站和下载日期等信息。 目前讨论消息队列用Kafka。 第二章 基本方案 1、我现在能想到的就是: 远程服务器编写程序, 不停读取文件的内容成为一个字符串,然后再加上来自的网站、下载日期等信息,组合成一个JSON字符串,通过调用kafka的生产者API将字符串写入Kafka。 2、JSON数据格式设计: { “source”: “来源网站名” , “filename” : “html文件名”, “download-date”: “下载日期” , ”content” : “一个html文件的全部字符串 “ } 注:假设.js \.css \.png文件都不需要 3、消息主题的设计: 一个网站对应一个topic,对应到本地的一个文件夹。 4、其他: 如果只是传输文件,不考虑加上网站、下载日期等信息的话,我知道的用Flume可能更方便,但是要加上网站、下载日期的信息(类似主题订阅的功能),flume就不太方便了? 5、可能存在的顾虑:网页数据文件对数据顺序性的要求的程度。 Kafka单分区的情况小支持消息有序性, 多分区下确保消息有序的方案还需深入调研。 如果之后一个主题下对应的网页文件没有特别的传输顺序要求,这一块应该会容易处理很多。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值