当前位置: 首页 > 科技观察

Kafka快速入门秘籍:背景介绍、应用场景分析、核心架构分析

时间:2023-03-17 12:34:12 科技观察

1.背景介绍介绍:其实这个背景,我们在介绍RabbitMQ的时候就已经说过了。这里讲到kakfa的时候,我们会把这一段拿出来再解释一遍。在谈实战之前,我们还是有必要进行理论讲解,以理论为辅,重在实战。在实战的基础上,进一步理解理论、底层原理、底层源码。在接下来的文章或视频中,我们将带大家去官网了解kafka环境搭建、kafka的基本使用以及kafka的容错测试。在掌握知识的同时,还可以顺便学习英语。1)问题介绍:假设我们现在需要设计这样一个用户注册系统:用户注册完成后,需要给用户发送一封激活邮件,开通一个用户账号,以及用户IP、用户设备等信息,并记录时间。原设计:2)但是存在一个问题:由于多系统强耦合,用户注册响应会很慢,严重影响用户体验。当流量大时,性能会变差。3)引入消息中间件:为了解决上述问题,我们引入消息中间件来实现系统的解耦。多个系统通过消息中间件进行异步通信。最终的设计图如下:即实现了系统解耦,也提高了系统响应速度4)消息中间件介绍:消息队列中间件(简称MQ),又称消息队列,是指利用高效可靠的消息传递机制进行平台无关的数据交换,并基于数据通信构建分布式系统。2、应用场景分析1)异步通信很多时候,为了加快应用系统的整体运行速度,并不需要立即响应一些请求。消息中间件提供了异步处理机制,允许将一些请求信息放入消息中间件中,但不会立即处理,而是慢慢处理。在资源有限的情况下,使用消息中间件可以轻松实现系统性能的翻倍!例如:用户注册成功的邮件通知;用户购物订单信息通知;大数据日志采集与处理对系统进行分解,使用消息中间件支撑突发访问压力3)业务系统解耦系统之间的耦合关系太强,会束缚系统的设计,增加系统的复杂度,从而可以通过消息中间件更好的设计系统是完成指定功能的系统,而不是将所有功能集成到同一个系统中。2.Kafka简介作为消息中间件,Kafka是一个分布式的、基于发布/订阅的消息系统。主要设计目标如下:提供时间复杂度为O(1)的消息持久化能力,即使对TB级以上的数据也能保证恒时访问性能和高吞吐量。即使在非常便宜的商用机器上,单机也能支持每秒100K消息的传输,支持KafkaServer之间的消息分区,分布式消费,保证每个分区消息的顺序传输。支持离线数据处理和实时数据处理1、kafka架构术语解释:Broker一个Kafka集群由一个或多个broker组成。具有Kafka环境的服务器可以称为代理。存储在TopicKafka集群上的消息有一个类别,称为主题。(用户只需要指定消息的topic就可以生产或消费数据,而不用关心数据存储在哪里)topic在逻辑上可以看做一个队列。每次消费都必须指定它的主题,可以简单理解为指定将这条消息放入哪个队列,有点类似于RabbitMQ。Partition为了让Kafka的吞吐量横向扩展,将topic在物理上划分为一个或多个partition。每个分区在物理上对应一个文件夹,该文件夹下存放着该分区的所有消息和索引文件。您可以在创建主题时指定分区数。等我们在实战中演示的时候再说明。因为每条消息都是追加到partition上,顺序写入磁盘,所以效率非常高(已经验证顺序写入磁盘效率高于随机写入内存,这是一个重要的Kafka高吞吐率的保证)。Producer负责发布消息给KafkabrokerConsumer消费消息。每个消费者属于一个特定的消费组(可以为每个消费者指定组名,如果不指定组名,则属于默认组)。同一个topic的消息只能被同一个消费组中的一个消费者消费,但是多个消费组可以同时消费这条消息。三、Kafka的其他核心概念1、消息存储很多传统的消息队列在消费完消息后会删除消息。一方面可以避免重复消费,另一方面可以保证队列的长度比较小,提高效率。Kafka集群会保留所有的消息,不管它们是否被消费。当然,由于磁盘的限制,不可能永久保留所有的数据(其实也没有必要),所以Kafka提供了两种删除旧数据的策略。一种是基于时间,另一种是基于分区文件大小。比如配置$KAFKA_HOME/config/server.properties让Kafka删除一周前的数据,或者配置Kafka分区文件超过1GB时删除旧数据。2.ConsumerGroup每个消费者实例都属于一个消费者组,每条消息只会被同一个消费者组中的一个消费者实例消费。(不同的消费者组可以同时消费同一条消息)Kafka保证的是在稳定状态下,每个消费者实例只会消费一个或多个特定分区的数据,而一个分区的数据只会被特定的特定消费消费者实例消费。这种设计的缺点是同一消费组中的消费者不能平均消费数据。优点是每个消费者不需要和大量的broker进行通信,减少了通信开销,降低了分配难度,实现起来也更简单。另外,由于同一个分区中的数据是有序的,这样的设计可以保证每个分区中的数据也被有序的消费。3.ConsumerRebalanceKafka通过Zookeeper管理集群配置,当consumergroup发生变化时(比如某个consumer故障下线),进行rebalance。具体含义是:如果一个消费者组中的消费者数量小于分区数量,则至少有一个消费者会消费多个分区的数据。如果消费者的数量与分区的数量相同,则恰好有一个消费者消费一个分区的数据。如果消费者数量大于分区数量时,部分消费者无法消费该主题下的任何消息。