文章目录

  • 一、简介
  • 1.有哪些主流的消息队列?
  • 2.为什么要使用消息队列?
  • 3.Kafka特性
  • 4.消息队列的应用场景
  • 5.消息队列的分类
  • 二、环境搭建
  • 三、组件构成
  • 1.Kafka由哪些组件构成?
  • 2.topic
  • 2.1 分区partition
  • 2.2 副本replication
  • 2.3 ISR和AR是什么,ISR的伸缩又指什么?
  • 3.控制器是什么?如何选举的
  • 4.分区leader选举
  • 四、Shell命令使用
  • 1.创建topic命令
  • 2.查看集群中有哪些topic
  • 3.查看指定topic的详细信息
  • 4.删除topic
  • 5.修改一个topic的分区数
  • 6.连接producer客户端
  • 7.连接consumer客户端
  • 总结


一、简介

1.有哪些主流的消息队列?

  • RabbitMQ:由Erlang(二郎)语言编写。
  • RocketMQ:由java编写,阿里开发。
  • Redis:用作消息队列时,数据量大小在10k以内速度快,数据量大时会非常慢。
  • Kafka:Apache开发,由Scala和java编写。

2.为什么要使用消息队列?

主要用来缓冲任务和削峰:上游数据有时会突发流量,下游可能扛不住,或者下游没有足够多的机器来保证处理,此时Kafka在中间可以起到一个缓冲作用,把消息暂存在kafka集群中,下游服务可以按照自己的节奏慢慢处理任务。


3.Kafka特性

  • 解藕:使用Kafka后,任务的处理者(consumer)与任务的发布者(producer)之间没有依赖关系。
  • 高吞吐量、低延迟:Kafka每秒可以处理几十万条消息,延迟可低到几毫秒。每个topic可以分多个partition,consumer group 对分区可并行读取。
  • 可扩展性:Kafka支持热扩展。
  • 持久性和可靠性:消息被持久化到磁盘,并支持数据备份防止数据丢失。
  • 容错性:允许集群中节点失败,失败个数为副本数-1。
  • 高并发:支持数千个客户端读写。

4.消息队列的应用场景

订单管理中,当订单支付成功后的回调信息中要做三件事:

  • 修改订单状态为已支付。
  • 计算会员积分。
  • 通知物流进行配送。

如果使用消息队列,则在收到异步通知后就马上响应用户,把后两件事放在队列中慢慢处理。


5.消息队列的分类

  • 点对点:一个队列可以有多个消费者一起消费,但一条消息只能被同一个消费组的某一个消费者进行消费。
  • 发布与订阅:消息被持久化到topic中,消费者可消费该topic中所有数据,同一条数据可以被多个不同消费组的消费者消费,数据被消费后不会自动删除。

二、环境搭建



三、组件构成

1.Kafka由哪些组件构成?

  • topic:就是一堆消息。
  • producer:向topic中发布消息。
  • consumer:订阅topic中消息,并从topic中拉取消息。
  • broker:管理topic中消息存储的服务器。

2.topic

2.1 分区partition

  • 为什么要分区:
    (1)从producer角度看,分区分布在不同的broker上,方便容量扩展,同时也提高吞吐量和负载均衡。
    (2)从consumer角度看,一个消费者组的某个消费者只能消费一个分区,分区后可以提高并发量,效率大大提高。但要求消费者组内的消费者数量不能大于topic的分区数。

2.2 副本replication

  • 副本是什么?
    (1)leader副本:用来提供读写功能,一个分区只有一个leader副本。
    (2)follower副本:只是被动地备份leader中数据,不提高读写功能,作用是为了提高分区的可用性。

2.3 ISR和AR是什么,ISR的伸缩又指什么?

  • ISR:In-sync Replicas(副本同步队列),包含了leader和所有与leader保持同步的follower的id,该队列由leader和控制器维护,如果follower从leader中同步时间超过阀值,就会从ISR中踢出去,并把该follower的id存入OSR(Out-sync replicas)列表中。
  • AR:AR=ISR+OSR
  • ISR伸缩:follower副本跟leader副本同步超时会被踢出,当follower副本同步了所有leader

3.控制器是什么?如何选举的

就是一个broker,集群中第一个启动的broker会在zookeeper中创建一个临时节点/controller 来试图让自己成为控制器,其他节点会在该节点消失时收到通知,然后分别向zookeeper中申请成为控制器,只有一个能成功,其他节点只能监听。


4.分区leader选举

如果某个leader挂了,控制器会把该节点id从ISR中移除,然后再从ISR中选择与leader保持最高同步的副本作为leader,如果都保持了最高同步,则按照顺序从前往后选择。


四、Shell命令使用

1.创建topic命令

bin/kafka-topics.sh --create --zookeeper 192.168.184.130:2181 --partitions 2 --replication- factor 2 --topic first

会在配置文件配置的目录中创建topic,分别为first-0,first-1。


2.查看集群中有哪些topic

bin/kafka-topics.sh --list --zookeeper 192.168.184.130:2181

3.查看指定topic的详细信息

bin/kafka-topics.sh --list --zookeeper 192.168.184.130:2181 --topic first

没有zookeeper可以使用Kafka吗?zookeeper有什么用?

  • 管理集群broker的上下线,如broker上线,会把broker的id写在zookeeper的/broker/ids节点下,下线就从/broker/ids中移除。
  • controller选举:Kafka集群中会有一个broker被zookeeper选举成为controller。
    controller有什么用?
    监听ids变化从而实现下面两个功能
    (1)topic的分区副本分配:一个副本为了实现负载均衡会被分成多个分区,这些分区信息以及与broker的对应关系由controller维护。
    (2)分区leader的选举。

4.删除topic

bin/kafka-topics.sh --delete --zookeeper 192.168.184.130:2181 --topic first

5.修改一个topic的分区数

bin/kafka-topics.sh --zookeeper 192.168.184.130:2181
--alter --partitions 3 --topic first

注意:分区数只能增加不能减少。


6.连接producer客户端

bin/kafka-console-producer.sh --broker-list 192.168.184.134:9092 --topic first

7.连接consumer客户端

  • 旧版本用法:
bin/kafka-console-consumer.sh -- zookeeper 192.168.184.130:2181 --from-beginning - -topic first

问题:offset的作用?
每条消息都有一个顺序的id号,叫做偏移量,用来唯一地识别分区中的每一条消息。

  • 新版本用法:
bin/kafka-console-consumer.sh --bootstrap-server 192.168.184.168:9092 --from-beginning --topic first

offset的值不再保存在zookeeper中,而是保存在一个叫做__consumer_offsets的内部主题中,它有50个分区,可通过命令 bin/kafka- topics.sh --list --zookeeper 192.168.184.130:2181 查看。


总结

未完待续。