Kafka学习笔记(1)- 一条消息的完整生命周期

奋斗吧
奋斗吧
擅长邻域:未填写

标签: Kafka学习笔记(1)- 一条消息的完整生命周期 架构博客 51CTO博客

2023-07-20 18:24:17 183浏览

Kafka学习笔记(1)- 一条消息的完整生命周期,写在前面详细介绍一下一条消息从产生到被消费的过程,从而去着手去学习Kafka消息生产首先消息的生产者需要和Kafka建立联系。消息的生产者一般通过Kafka客户端的SDK连接到Kafka集群。然后发送消息到特定的主题。这里消息的生产者可以选择同步或者异步来发送消息同步发送:在此模式下,消息的生产者在发送一条消息后会阻塞等待服务器的确认。直到消息被写入到Kafka的分区并且生产者收到消息确认响应之

写在前面

详细介绍一下一条消息从产生到被消费的过程,从而去着手去学习Kafka

消息生产

  1. 首先消息的生产者需要和Kafka建立联系。消息的生产者一般通过Kafka客户端的SDK连接到Kafka集群。
  2. 然后发送消息到特定的主题。
  3. 这里消息的生产者可以选择同步或者异步来发送消息
  1. 同步发送:在此模式下,消息的生产者在发送一条消息后会阻塞等待服务器的确认。直到消息被写入到Kafka的分区并且生产者收到消息确认响应之后。生产者才会继续发送下一条消息。
  2. 异步发送:此模式下,消息生产者发送消息之后不会等待服务器的确认响应,而是继续发送下一条消息。生产者将发送的消息放入发送缓冲区,然后立即返回。后台线程负责将消息批量发送到 Kafka 服务器,并在收到服务器的确认响应后进行处理。
  1. 这里的处理指的是,消息生产者可以自行处理一些自定义的逻辑。

消息存储

  1. 消息到达Kafka集群中,然后发送到对应主题的对应分区之中。消息会被Kafka使用分布式消息存储系统进行持久化。
  1. 分布式的消息存储系统:这里的分布式消息存储系统指的是Kafka自身的消息存储机制
  2. 这里指:Topic->Partition->Replica的设计
  1. 并在多个副本之间进行复制以确保消息的可靠性。

消费者组的创建并消费消息

  1. 消费者组的概念
  1. 一个消费者组可以被认为是一个逻辑上的消费者,由多个实际的消费者组成。
  1. 如何创建消费者组
  1. 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);
  1. 相同的 消费者组ID 将被视为同一个消费者组
  2. 具有相同 消费者组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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695