标签:架构设计 partition broker kafka topic 消息 offset Consumer
一:概述
Kafka是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统,可以用于web/nginx日志、访问日志,消息服务等等。
Kafka是基于发布-订阅模式,即同一条数据可以被多个消费者消费,但是多个消费者必须处在不同分组中
二:优点:
1)解耦:
数据产生系统与数据处理系统分离,系统间影响降到最低,单个系统出现异常不影响整体环境。
2)冗余:(副本)
kafka创建多个分区副本存储消息,保证主分区出现通讯异常后,可以在其他节点访问副本消息。
3)扩展性:
通过zookeeper,可以实现动态变化节点数(broker),并同步分区副本。
4)灵活性&峰值处理能力:
producer,broker,consumer均采用负载均衡处理数据,避免单个broker,单个topic,单个partition处理过量的数据
5)可恢复性:
一个处理消息的进程挂掉,已经加入到队列中的消息仍然可以在系统恢复后被处理。
6)缓冲:
kafka消息优先写在pagecache中,消息处理增速,可以在O(1)的系统开销下进行消息持久化。
7)异步通信:
非立即处理数据,等待consumer从队列中poll消息。
三:组件
1)broker:
Kafka 集群包含一个或多个服务器,服务器节点称为broker。broker存储topic的数据。每一个topic可以切分成多个partiton,partition均匀分布在broker中,当partion>broker,会出现broker负载不均衡
2)Topic:
消息类别,由业务逻辑上定义,属于同一类别的消息,以相同的逻辑处理message。
3)Partition:
将topic中的消息分布式存储在一个或多个partition。每个独立的partition中的数据是有序的,同一个topic不同partition间的数据是无序。
4)Producer:
产生数据即造数据,为每个topic生成数据。
5)Consumer:
处理和加工数据,从topic中pull数据,加工成业务需要的数据。
6)Consumer Group:
为每个topic创建的,同属一个组的Consumer对topic中的消息消费一次。隶属不同组的Consumer可以重复消费同一个message,实现一个topic消息的广播和单播的手段。
7)Leader:
每个partition有多个副本,但是每个分区有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
8)Follower:
用于备份partition的副本,当leader失效时,上位,实现了高可用。
9)Offset:
偏移量,用来记录单个组中consumer对每个partition消费到的位置。可以实现重复或跳跃消费message。
四:为啥高性能
1)Push vs. Pull
push:是由broker收到消息后,主动推送给Consumer,不去考虑Consumer所承受的压力,会造成网络拥塞,网卡塞满,可以尽可能以最快速度传递消息。
pull:是由Consumer自主控制,随时决定消费消息(想什么时候处理就什么时候处理),以及消费处理快慢。kafka的consumer采用这种方式。
2)数据安全性
当Producer向broker发送消息时,通过配置ack参数配置分成三种级别:0-保证数据正确产生,并准备发送给broker,无法保证一定发送成功。1-发送数据到broker的leader中,但是未等副本保存结果。-1-等待副本保存成功后再确认消息commit成功。Producer可以失败尝试,可以生成一种类似于主键的东西,通过幂等性的重试多次,保证同一message只被commit一次。
当Consumer通过offset从broker读取消息后,1.可以选择立即commit,修改offset到下一条消息上。2.可以等待单个消息加工完成手动commit,保证了每条数据都被消费。3.批量消费消息加工后,手动commit,减少了offset修正次数,增加了重复消费几率。如果未提交offset,会重复消费。
通过参数enable-auto-commit参数配置是否开启自动提交,auto-offset-reset分为三个参数:earliest-获取上一次消费的offset继续消费或者从头开始消费(重复消费),必重复,latest-获取上一次消费的offset继续消费或者最新的offset消费(丢失消费),none-必须要有上次消费的offset,否则报错。
这个offset由Consumer控制。broker是无状态的,它不需要标记哪些消息被哪些消费过,也不需要通过broker去保证同一个Group只有一个Consumer能消费某一条消息,因此也就不需要锁机制,这也为Kafka的高吞吐率提供了有力保障
3)数据顺序性
在发送一条消息时,可以指定这条消息的key,Producer根据这个key和Partition机制来判断应该将这条消息发送到哪个Parition。相同的key会发送到同一个partition中,保证了数据顺序性,破坏了高性能。
标签:架构设计,partition,broker,kafka,topic,消息,offset,Consumer 来源: https://www.cnblogs.com/double-efficiency/p/15703542.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。