前言基本概念生产与消费服务端参数配置 前言 例如:Kafka是后端常用的消息队列,将通过《深入理解Kafka核心设计与实践原理》进行学习,本文为第一章的学习笔记。
Kafka 起初是由linkedin 公司用Scala开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现己捐献给Apache基金会。
Kafka可以扮演三大角色:
消息系统:Kafka 和传统的消息系统一样都具有系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。Kafka 相对于普通的消息系统,还提消息顺序性保障以及回溯消费的功能。存储系统:Kafka 把消息持久化到磁盘,相比于其他基于内存存储的系统,可以有效降低数据丢失的风险。流式处理平台:Kafka 不仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操作。 基本概念
一个典型的Kafka 体系架构包括若干Producer、若干Broker、若干Consumer,以及一个ZooKeeper集群。
ZooKeeper 是Kafka 用来负责集群元数据的管理、控制器的选举等操作的Producer:生产者,发送消息的一方,负责创建消息并将消息发送到BrokerBroker:服务代理节点,可将其看做Kafka服务节点,负责将收到的消息存储到磁盘中Consumer:消费者,接收消息的一方,负责从Broker订阅并消费消息
Kafka中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题,而消费者负责订阅主题并进行消费。一个主题下可以细分为很多的分区,同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志文件,消息在被追加到分区日志、文件的时候会分配一个特定的偏移offset。offset是消息在分区中的唯一标识,Kafka通过它来保证消息在分区内的顺序性,不过offset 并不跨越分区,也就是Kafka 保证的是分区有序而不是主题有序。
每一条消息被发送到broker 之前都会根据分区规则选择存储到哪个具体的分区。如果分区规则指定得合理,所有的消息都可以均匀地分配到不同的分区中。
Kafka 为分区引入了多副本(Replica)机制来保障容灾能力,副本中存储的内容与分区中的内容一致,副本之间是“一主多从”的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步。
Kafka 消费端也具备一定的容灾能力。Consumer从服务端拉取消息进行消费,并且会保存消费分具体位置,如果消费端出现宕机,可以在恢复上线后根据之前保存的消费位置重新拉取所需要的消息再次消费,从而不会造成消息的丢失。
HW:高水位。标识了一个特定的消息偏移量,消费者只能拉取到这个offset之前的消息。LEO:是Log End Offset的缩写,它标识当前日志文件中下一条待写入消息的offset。
生产与消费Kafka 提供了许多实用的脚本工具,存放在$KAFKA HOME的bin目录下,其中与主题有关的就是kafka-topics.sh脚本。
bin/kafka- topics.sh -- zookeeper local host:2181/kafka --create --topic topic-demo --replication-factor 3 --partitions 4
其中–zookeeper 指定了Kafka 所连接的ZooKeeper服务地址。–topic指定了所创建主题的名称, --replication-factor 指定了副本因子,–partitions指定了分区个数,–create是创建主题的动作指令。
服务端参数配置zookeeper.connect:该参数指明broker要连接的ZooKeeper集群的服务地址。listeners:该参数指明broker 监听客户端连接的地址列表,即为客户端要连接broker的入口地址列表。broker.id:该参数用来指定Kafka集群中broker的唯一标识,默认值为-1。log.dir和log.dirs:Kafka 把所有的消息保存在磁盘上,这两个参数用来配置Kafka日志文件存放的根目录。message.max.bytes:该参数用来指定broker 所能接收消息的最大值,默认值为1000012B约等于976.6KB。