一、背景
今天是11月12号,昨天双11,一个特殊的日子,昨天大家集体购物,此时产生了一个问题,上亿的人同时下单,各大电商是如何在此时处理上亿的订单呢?
当上亿客户下单,将产生大量的订单(消息),此时订单已经写入了数据库,但是后台处理能力有限,不能及时处理上亿级的订单,于是后台告诉用户一个假象,你已经下单成功,但其实用户的下单信息被缓存到了消息队列,后台再从消息队列中获取订单,对订单进行处理 。——异步通信
二、kafka
Kafka 是一个分布式消息发布订阅系统,(消息队列MQ)主要应用于 大数据实时处理领域。
1)kafka是一个消息队列,队列的特点是先进先出,可作为缓冲机制,解决生产速度大于消费速度的问题。
2)异步处理机制:不立即处理消息,什么时候需要处理在进行处理
3)消息备份,不会随着部分系统挂掉而产生消息丢失。
三、消息队列的两种模式
点对点模式,又叫 消息队列模型(一个生产者,一个消费者,消费者收到消息后,消息删除) 只能有一个生产者和一个消费者。
发布/订阅模式,有了主题(topic)的概念,这个模型可能存在多个发布者(Publisher),多个发布者向相同的主题发送消息,而订阅者(Subscriber)也可能存在多个,它们都能接收到相同主题的消息。生活中的报纸订阅就是一种典型的发布 / 订阅模型。
三、kafka架构
1)Producer : 发消息的客户端;向队列尾推送消息
2)Consumer :消费消息的客户端;从队首取消息。
3)Consumer Group (CG):消费者组,由多个consumer组成。
一个分区只能由一个组内消费者消费;消费者组之间互不影响。
消费者组里面的不同消费者不可以消费同一个消息,也就同一个topic,消费者组提高了消费速率)
消费者组我们可以作为一个大的消费群体(一家人),里面的各个小的消费者不可能消费同一个消息,这样效率太低。
好比一个家庭里面的成员采购物品,不能采购相同的物品一样。
所以我们有一个这样的结论,一个消费者组里面的消费者个数不得多于主题的个数。
4)Broker :一台kafka服务器就是一个broker。一个集群由多个broker 组成。一个broker
有多个topic。
5)Topic :可以理解为一个队列,生产者和消费者面向同一个 topic;
消息队列可能有很多消息,但是不是每一个消息消费者都要去获取,所以生产者生产消息后,给消息命名,
也就是主题名,消费者根据主题去拿自己的消息。我们可以把主题当成一个小的消息队列。
6)Partition:一个大的 topic 可以分布到多个 broker(即服务器)上,
一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
7)Replica:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失。
且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。
9)follower:每个分区多个副本中的“从”,实时从leader中同步数据,保持和leader数据的同步。
leader 发生故障时,某个follower会成为新的follower。
四、kafka工作流程
三台服务器broker0 broker1 broker2 三台服务器,搭建了一个kafka集群,且创建了一个主题为TopicA消息,对该消息进行了两次备份(leader 和 follower),且备份的分区不可能和被备份的在一个服务器上,这样备份也就没有意义了。备份主题需要不断地同步产生的消息。每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
假如生产者生产消息,同一个主题的消息被切分为三份,存入到不同的分区(疑问:分区存消息是按照哪种规则去存的呢?),存入的消息肯定是一致的,先生产谁,就先存入谁,但是消费者取出消息则需要从不同的三个分区去取,那应该是先从哪个分区去取呢,所以存入消息的顺序是一致的,取出消息的顺序就可能不一致。后面博客我们将持续分享kafka的生产分区侧率,以及消费者的消费策略。
五、kafka命令操作
创建主题——创建一个名为“first” 的topic 副本个数是2 分区数是1
bin/kafka-topics.sh --create --zookeeper 192.168.60.72:2181 --replication-factor 2 --partitions 1 --topic first
删除主题(需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除)
bin/kafka-topics.sh --delete --zookeeper 192.168.60.72:2181 --topic first
查看主题详情
bin/kafka-topics.sh --describe --topic first --zookeeper 192.168.60.72:2181
查看当前服务器topic
bin/kafka-topics.sh --zookeeper 192.168.60.72:2181 --list
发送消息
bin/kafka-console-producer.sh --broker-list 192.168.60.72:9092 --topic first
This is a message
This is another message
接收消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.60.72:9092 --topic first --from-beginning
This is a message
This is another message
配置环境变量
[atguigu@hadoop102 module]$ sudo vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
查看kafka进程
ps -ef | grep kafka
上一篇:搭建kafka集群