基础架构
Producer
消息生产者,就是向 kafka broker 发消息的客户端
Consumer
消息消费者,向 kafka broker 取消息的客户端;
Consumer Group (CG)
消费者组,由多个 consumer
组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
Broker
一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker可以容纳多个 topic。
Topic
可以理解为一个队列,生产者和消费者面向的都是一个 topic;
Partition
为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个
partition,每个 partition 是一个有序的队列;
Replica
副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka
提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
leader
每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
follower
每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个
follower 会成为新的 leader 。
命令行操作
- 查看当前服务器中的所有 topic
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --list
- 创建 topic
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka--create --replication-factor 3 --partitions 1 --topic first
–replication-factor 定义副本数
–partitions 定义分区数
–topic 定义 topic 名
- 删除 topic
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --delete --topic first
- 发送消息
bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first
- 消费消息
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092
--topic first //普通消费
bin/kafka-console-consumer.sh--bootstrap-server hadoop102:9092 --from-beginning --topic first //--from-beginning:会把主题中以往所有的数据都读取出来。
bin/kafka-console-consumer.sh
--bootstrap-server hadoop102:9092 --topic first4 --consumer.config config/consumer.properties //--consumer.config config/consumer.properties 配置消费者组
- 修改分区数
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --alter --topic first --partitions 6
- 查看某个 Topic 的详情
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --describe --topic first
架构深入
生产者
分区策略
分区的原因
分区的原则
数据可靠性保证
副本数据同步策略
ISR
ack 应答机制
acks
0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据;
1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会丢失数据;
-1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复;
故障处理细节
follower 故障
leader 故障
语义
Least Once 语义
将服务器的 ACK 级别设置为-1,可以保证 Producer 到 Server 之间不会丢失数据,即 At Least Once 语义。
At Most Once 语义
将服务器 ACK 级别设置为 0,可以保证生产者每条消息只会被发送一次,即 At Most Once 语义。
Exactly Once 语义
At Least Once + 幂等性 = Exactly Once
要启用幂等性,只需要将 Producer 的参数中 enable.idompotence 设置为 true 即可。
消费者
- 消费方式
- 分区分配策略
- RoundRobin
- Range
- offset 的维护
事务
- Producer 事务
Producer事务机制是指在发送消息时,将多个消息打包成一个事务,要么全部发送成功,要么全部失败。这种机制可以确保消息的原子性和一致性,避免了消息发送过程中的数据丢失或重复发送等问题。在使用Producer事务机制时,需要使用Kafka的事务API,例如beginTransaction()、send()、commitTransaction()等方法。 - Consumer 事务
Consumer事务机制是指在消费消息时,将多个消息打包成一个事务,要么全部消费成功,要么全部失败。这种机制可以确保消息的一致性和可靠性,避免了消息消费过程中的数据丢失或重复消费等问题。在使用Consumer事务机制时,需要使用Kafka的事务API,例如beginTransaction()、poll()、commitTransaction()等方法。
API
Producer API
-
异步发送 API
- 不带回调函数的 API
- 带回调函数的 API
(1)创建配置信息
(2)创建生产者对象
(3)发送信息
-
同步发送 API
Consumer API
-
自动提交 offset
-
手动提交 offset
同步提交 offset
异步提交 offset -
自定义存储 offset
自定义 Interceptor
-
ProducerInterceptor接口
- configure(Map<String, ?> configs):在拦截器被初始化时调用,可以在此方法中读取配置参数。
- onSend(ProducerRecord<K, V> record):在消息被发送到Kafka集群之前调用,可以在此方法中对消息进行修改或添加元数据等操作。
- onAcknowledgement(RecordMetadata metadata, Exception exception):在消息被成功发送到Kafka集群后调用,可以在此方法中记录消息的发送情况。
- close():在拦截器被关闭时调用,可以在此方法中释放资源。
-
ConsumerInterceptor接口
- configure(Map<String, ?> configs):在拦截器被初始化时调用,可以在此方法中读取配置参数。
- onCommit(Map<TopicPartition, OffsetAndMetadata> offsets):在消费者提交偏移量之前调用,可以在此方法中记录消息的消费情况。
- onConsume(ConsumerRecords<K, V> records):在消息被消费之前调用,可以在此方法中对消息进行过滤或修改等操作。
- close():在拦截器被关闭时调用,可以在此方法中释放资源。
-
实现拦截器时,需要注意以下几点:
(1)拦截器的实现应该尽量简单,避免对消息处理过程造成过大的影响。
(2)拦截器应该尽量避免对消息的性能造成影响,例如不要在拦截器中进行复杂的计算或IO操作。
(3)拦截器应该尽量避免对消息的顺序造成影响,例如不要在拦截器中对消息进行排序或分组等操作。
(4)拦截器应该尽量避免对消息的可靠性造成影响,例如不要在拦截器中删除或修改消息的关键信息。