Kafka学习笔记(1)- 一条消息的完整生命周期
标签: Kafka学习笔记(1)- 一条消息的完整生命周期 架构博客 51CTO博客
2023-07-20 18:24:17 183浏览
写在前面
详细介绍一下一条消息从产生到被消费的过程,从而去着手去学习Kafka
消息生产
- 首先消息的生产者需要和Kafka建立联系。消息的生产者一般通过Kafka客户端的SDK连接到Kafka集群。
- 然后发送消息到特定的主题。
- 这里消息的生产者可以选择同步或者异步来发送消息
- 同步发送:在此模式下,消息的生产者在发送一条消息后会阻塞等待服务器的确认。直到消息被写入到Kafka的分区并且生产者收到消息确认响应之后。生产者才会继续发送下一条消息。
- 异步发送:此模式下,消息生产者发送消息之后不会等待服务器的确认响应,而是继续发送下一条消息。生产者将发送的消息放入发送缓冲区,然后立即返回。后台线程负责将消息批量发送到 Kafka 服务器,并在收到服务器的确认响应后进行处理。
- 这里的处理指的是,消息生产者可以自行处理一些自定义的逻辑。
消息存储
- 消息到达Kafka集群中,然后发送到对应主题的对应分区之中。消息会被Kafka使用分布式消息存储系统进行持久化。
- 分布式的消息存储系统:这里的分布式消息存储系统指的是Kafka自身的消息存储机制
- 这里指:Topic->Partition->Replica的设计
- 并在多个副本之间进行复制以确保消息的可靠性。
消费者组的创建并消费消息
- 消费者组的概念
- 一个消费者组可以被认为是一个逻辑上的消费者,由多个实际的消费者组成。
- 如何创建消费者组
group.id指定消费者组ID
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-consumer-group");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
- 相同的 消费者组ID 将被视为同一个消费者组
- 具有相同 消费者组ID 的消费者将共享消费者组内的分区并进行负载均衡
- 消费者通过订阅一个或者多个主题来加入消费者组,并开始消费对应主题下的消息
consumer.subscribe(Arrays.asList("topic1", "topic2"));
- Kafka会将消费者组所订阅的主题中的分区分配给组内的消费者,从而达到负载均衡的目的
- 不同的分区由不同的消费者负责消费
- 所以由此,Kafka要实现消息的顺序消费的话,可以设置分区的数量为1,消费者组内消费者的数量为1从而达到顺序消费消息的目的。
消费者数量和分区数量的配置
如果一个主题有三个分区,消费者组内有三个消费者,并且每个消费者分别订阅了一个分区,这样可以实现较好的负载均衡。每个消费者只负责消费一个分区,这样可以最大程度地发挥Kafka的并行消费能力,提高整体的消息处理吞吐量。
如果消费者组内的消费者数量大于分区数量,也就是说有多余的消费者,多余的消费者将无法消费任何消息,因为每个分区只能被一个消费者所消费。这时会导致一部分消费者处于空闲状态,浪费资源,降低了整体的吞吐量。
而如果消费者组内的消费者数量小于分区数量,也就是说消费者的数量不足以覆盖所有分区,会导致有些分区没有消费者来消费。这样会导致一部分消息无法被及时处理,造成消息堆积,影响消息的实时性和处理效率。
因此,为了实现最佳的负载均衡和高吞吐量,消费者组内的消费者数量应该与主题的分区数量相匹配。当分区数量增加时,消费者数量也应相应增加,以充分利用所有分区,并确保所有消息能够及时得到处理。
实际消费消息
在 Kafka 中,消息可以以两种方式被消费:消费者主动拉取和 Kafka 发送订阅消息流。
消费者主动拉取
在消费者主动拉取的模式下,消费者通过轮询的方式从 Kafka 的一个或多个分区中拉取消息。具体来说,消费者会定时向 Kafka 发送拉取消息的请求,Kafka 会返回一批消息给消费者,消费者再对这批消息进行处理。消费者可以控制每次拉取的消息数量,也可以控制拉取的频率。
消费者主动拉取的优点是可以控制消息的处理速度,可以避免消费者处理消息的速度过慢或过快。缺点是需要消费者自己维护拉取的逻辑,需要考虑如何处理网络异常、分区重平衡等问题。
Kafka 发送订阅消息流
在 Kafka 发送订阅消息流的模式下,Kafka 会将消息主动推送给消费者。具体来说,消费者会向 Kafka 订阅一个或多个分区的消息流,在有新的消息到达时,Kafka 会将消息推送给订阅了该分区的消费者。消费者不需要自己维护拉取的逻辑,也不需要考虑网络异常、分区重平衡等问题。
Kafka 发送订阅消息流的优点是可以简化消费者的逻辑,减少开发和维护成本。缺点是无法控制消息的处理速度,可能会导致消费者处理消息的速度过慢或过快。
总结
在实际应用中,可以根据具体需求选择适合的消息消费方式。如果需要精细控制消息的处理速度,或者需要处理网络异常、分区重平衡等问题,建议使用消费者主动拉取的模式;如果需要简化消费者的逻辑,可以考虑使用 Kafka 发送订阅消息流的模式。
消费者的消费进度
消费者会记录自己在每一个分区中的消费进度。消费者定期提交消费进度,以便在重新启动或发生故障时能够从上次消费的位置继续消费。
消息提交和偏移量管理
消费者会定期提交消费进度,通常以消费者组的形式进行提交。 提交消费进度后,Kafka 会将消费者的偏移量进行管理,以便在需要时进行消费者的重平衡和故障恢复。
消息消费完成
当消费者完成对消息的处理后,可以将消息标记为已消费,并进行确认操作。 消费者可以根据业务逻辑决定消息是否需要标记为已消费。
消息过期和清理
Kafka 提供了消息的过期机制,可以根据设置的消息保留时间来自动删除过期的消息。 过期的消息会被清理,释放存储空间。
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客

