kafka 基本概念
- 消息队列
1、什么是消息队列
消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可靠专递,消息发布者只管把消息发布到MQ中而不管谁来取,消息使用者只管从MQ中取消息而不管谁发布的,这样发布者和使用者都不用知道对方的存在。
2、消息队列的应用场景
应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;
3、消息队列的两种模式
消息队列包括两种模式,点对点模式(point to point, queue)和发布/订阅模式(publish/subscribe,topic)
点对点:点对点模式下包括三个角色:消息队列、生产者、消费者
消息发送者生产消息发送到queue中,然后消息接收者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息接收者不可能消费到已经被消费的消息。
3.1、点对点模式特点:
每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中);
发送者和接发收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;
3.2、发布订阅模式
每个消息可以有多个订阅者;
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行;
- kafka是什么?
Kafka 是一个分布式,分区的,多副本的,多订阅者的消息发布订阅系统,由 LinkedIn 公司开发。以下是 Kafka 的一些相关知识:
1、优点
可靠性强(分布式-分区-副本)、扩展性强(可伸缩)、性能高(数据读写)、耐用性强(数据持久化)、时效性强。
2、缺点
由于是批量发送,数据并非真正的实时; 仅支持统一分区内消息有序,无法实现全局消息有序; 有可能消息重复消费; 依赖zookeeper进行元数据管理。
kafka重要概念
-
Topic:Kafka 中的消息被组织成主题(topic),生产者将消息发布到特定的主题,消费者从感兴趣的主题订阅消息。
-
Partition:每个主题(topic)可以被分成多个分区(partition),每个分区是一个有序的消息队列,生产者将消息发送到某个特定的分区,每个分区可以分布在不同的服务器上以实现负载均衡、容错等目的。
-
Broker:Kafka 集群中的每个节点称为 broker,每个 broker 可以承载多个分区(partition),每个分区(partition)可能被分配到不同的 broker 上。
-
Producer:消息的生产者,可以将消息发布到特定主题(topic)的某个分区(partition)。
-
Consumer:消息的消费者,可以从某个主题(topic)的某个分区(partition)订阅消息。
-
Consumer Group:若干个消费者可以组成一个消费者组(consumer group),共同消费某个主题(topic)的所有消息。每个分区(partition)只能由同一个 consumer group 中的一个消费者消费。
-
Offset:Kafka 中的每条消息都有一个唯一的偏移量(offset),代表该消息在分区(partition)中的位置。每个消费者都有自己的 offset 计数器,可以指定从哪个 offset 开始读取消息。
-
Replication:Kafka 支持数据备份和容错机制,每个分区(partition)可以有多个副本(replica),这些副本分布在不同的 broker 上,以保证某一个 broker 宕机时数据不会丢失。
副本
在kafka 中, 副本和正本都被称之为副本,但存在leader 和follower之分,活跃的称之为leader,其它的为follower, topic、partition、replica的关系:消息进来的时候首先存入leader replica,然后从leader replica中复制到其它的follower replica, 只有当复制全部完成的时候,consumer才可以消费此条消息,这样的措施的目的是为了意外发生的时候,数据可以恢复,consumer的消费也是从leader replica中获取的。
概念要点补充
- 一个partition只能被同组的一个consumer消费
- 同一个组里的一个consumer可以消费多个partition
- 消费效率最高的情况是partition和consumer 的数量相同,这样可以确保每个consumer可以专职负责一个partition
- consumerd的数量不能多余partition的数量,当consumer的数量大于partition时,就会有consumer闲置
- consumer可以认为是一个订阅者的集群,其中的每个consumer负责自己所消费的分区