当前位置: 首页 > 后端技术 > Java

kafka

时间:2023-04-01 15:42:32 Java

kafka是一个基于发布订阅模型的消息队列,用scala编写,具有强大的吞吐量,适用于大数据的实时处理。优势Multi-producer-consumer-brokerScale-out数据冗余数据按主题分类,压缩数据批量发送,减少传输开销,提高吞吐量支持多种模式的消息,基于磁盘持久化的高性能,亚秒级延迟消费者可以消耗多个主题消耗更少的CPU网络内存。支持跨数据中心和镜像集群的数据复制。缺点:批量发送不实时,只能实现分区内排序,不能实现全局排序。如果监控不完善,就会丢失数据,不支持交易。重复消费架构题目:producer:生产者consumergroup:消费者组,其中包含多个消费者。consumer:消费者从broker拉取消息,以合适的速度消费消息。offset:偏移量,相当于消息在队列中的位置。broker:Kafka集群由多个实例组成,每个实例称为broker。一个代理可以被多个主题共享。Partition:一个topic被划分为多个partition。每个分区处理一部分消息。每个分区都是有序的。每个分区只能由一个消费者消费。一个消费者可以消费多个分区。分区数小于或等于消费者数。分区可以方便扩展和提高并发性。Replication:一个partition分为一个leader和多个follower。它们都成为复制并分布在多个代理上。复制的数量不能超过代理的数量。原理写法producer采用push方式向broker发布消息,每条消息附加到patition中,并赋予唯一的offset值。属于顺序写盘,顺序写比随机写至少快3个数量级!分区方式1.指定partition2.不指定,但是key,取key的hash值的余数到分区数3.没有key,第一次调用时随机生成一个整数,每次调用后每次递增,用这个数来分区数的余数(循环算法)存储结构每个分区分成多个段,每个段有一个.INDEX存储索引(消息在日志中的偏移地址文件)和一个.LOG存储数据。索引和日志文件以其第一条消息的偏移量命名。datareliabilityatleastonceatmostonceexactlyonceproducer信息发送给Brokerproducer从ZK中找到目标Partition的Leader元数据。生产者向领导者发送消息。Leader接受消息持久化,然后根据acks配置选择如何同步Follower。Follower如上所述同步数据后向Leader回复ack。Leader和Follower同步完成后,Leader回复ack给producer。acks配置request.required.acks=0producer不等待broker的ack,提供最低延迟。代理在写入磁盘之前返回。当broker失效时,数据可能会丢失,对应AtMostOnce模式。request.required.acks=1默认值,producer等待broker的ack,partition的leader放置成功后返回ack。如果leader在follower同步成功之前失败,数据就会丢失;如果领导者返回信息,则认为成功。request.required.acks=-1/allproducer等待broker的ack,partition的leader和follower(在ISR中)完成放置成功后才返回ack。但是如果leader收到信息返回ok,follower收到信息但是leader发送ack失败,那么producer会重新发送信息给follower。对应于至少一次模式。幂等性不管producer重复发送多少条消息,server端只会持久化一条数据,在producer参数中设置enable.idompotence=true。它使用broker缓存requestno的原理。Producer.type=sync,默认模式,数据落盘。Producer.type=async,异步模式,数据刷新到os的pagecache中返回。如果数据宕机,数据就会丢失。拉取数据消费者从broker拉取消息分为两个阶段:1.获取数据并提交offset2.处理数据如果先提交offset再处理数据,可能会处理失败。如果先处理数据,再提交offset,可能会重复消费。如果代理中没有数据,消费者可能会陷入拉环。消费者在消费时会传入一个时长参数。如果当前没有可供消费的数据,消费者会等待一段时间再返回。分区策略通过paritition.assignment.strategy设置rangeAssignor范围分区。默认模式分区是为消费者散列的。如果用不完,前面的就多消耗一个分区。缺点:对于每一个无穷无尽的topic,之前的consumer会多消费一个partition,很少变多,是不平衡的roundRobinAssignor分配策略,round-robinpartitions取出所有partitions和所有consumer,hashpartitions。当所有消费者订阅同一个主题时,它是平衡的。当所有消费者订阅的主题都不相同时,就是不平衡的。高效读写tps:事务数/秒qps:查询数/秒Kafka可以百万tps顺序读写数据memory-mappedfilevirtualmemory将内存划分为虚拟页,与物理内存使用ospage相同实现物理内存到文件的映射,操作读写数据到页面,os根据映射对应物理硬盘,从而实现顺序读写的功能。缺点是真实磁盘可能会造成数据丢失,直接读取内存DMA(directmemoryaccess)外部设备不经过CPU直接与系统内存交换数据的技术称为DMA。数据传输只使用DMA,不经过CPU,称为零拷贝,零拷贝。kafka读写数据时,磁盘读取数据到操作系统内存的pagecache;然后传输到nic网卡的缓冲区。当batchdealconsumer拉取数据时,Kafka不会一个一个发送数据,而是批量处理,这样可以节省网络传输,提高TPS,但缺点是降低了实时性。zookeeper的作用1Broker注册管理分布式部署和独立broker2Topic注册topic分区信息及其分布式broker信息由zookeeper维护3Consumer注册Consumer启动会在zookeeper下创建节点,consumer会相互监听变化,方便负载均衡,消费者也会监听broker,以方便负载均衡。4生产者负载均衡生产者合理分配消息到各个分区5消费者负载均衡消费者去哪个broker拉取信息一个消费者可以监听多个分区6分区和消费者的关系分区必须写入消费者id7消费进度(customeroffset)节点上用于失败重试,consumer重启或者其他consumer接管继续多个consumer问题的进度为什么不把读和写分开呢?Kafka只能读写master,slave完全是一个备份。主从优缺点好处:从节点分担主节点的读压力。缺点:1.主从数据不一致。2.延迟。Redis主从需要经过网络→主节点内存→网络→从节点内存。Kafka要经过网络→主节点内存→主节点磁盘→网络→从节点内存→从节点磁盘,比较耗时。读写分离是为了负载均衡,但是Kafka已经均衡好了。主副本可以平均分布在每个代理上。分配不均的可能性及解决方案有些经纪商的分区比其他经纪商多。生产者只写入某些分区。消费者只消费部分分区。复制切换不均匀。一些券商的领导者太多?zooker如何决定将哪个broker放入master副本,将哪个broker放入slave副本??Kafka的分配算法?Kafka的优先副本选举