前言
kafka是常用MQ的一种,站在使用者的角度来看待,kafka以及所有的MQ应该是这样的:
(注意箭头的方向)
这个一点问题都没有,即使你站在MQ的开发者的角度,这个图也是没问题的,你就当它是这样的用就行。
但是,如果你是站在一个候选人或者面试官的角度,上面这个图就不行了,所以没法办,扣的就是细节,问的就是原理。
而上图,仅仅只能代表MQ的一种思想或者说理念。
Kafka版本查看
不得不说,就像个大傻叼,Kafka没提供直接方便查看的命令,且,命名也恶心的一逼。
笔者是Mac电脑,用brew方式安装的。
/usr/local/Cellar/kafka/2.2.1 通过这个安装目录结构就能看出,笔者目前用的是2.2.1版本
至于 /usr/local/Cellar/kafka/2.2.1/libexec/libs这个目录下的一堆东西,也可以分辨出来
2.12-2.2.1 前面的2.12说的是Scala版本,后面的是Kafka版本。
Kafka整体架构
Kafka cluster
站在运维的角度来看,Kafka集群就是这样的(忽略zk)
首先要明白,Kafka是以集群部署的方式对外提供服务的。
Kafka所说的这个broker就是我们说的集群中的一个实例,你理解为一个Kafka进程或者一台机器或者一个节点都行。
问题1:Kafka集群,消息数据如何存储的?
是像redis cluster这种,每个集群中的实例只存部分数据,所有实例加起来才是完整的redis数据?
还是像zk cluster这种,每个集群中的实例,数据都一样?
这里需要先介绍另一个Kafka中的概念:topic
topic是什么
在实际生产工作中,并不是一个场景使用这个Kafka集群,可能几个业务公用一个Kafka,这就出现来一个问题,我们好几方生产者,往同一套Kafka里塞各自的消息,我们好几方的消费者,咋区分这些消息哪些是我所需要的呢?
我们自己可以解决:生产者和消费者约定好一个标记,我们为这个消息打上这个标记,消费者只消费带有这个标记的消息。
所以消费者每次接到消息,都要判断
if msg.tag != "xxx" {
return
}
...开始消费...
这虽然解决了问题,但是不优雅。
所以Kafka解决了这个问题,Kafka在接收生产者的消息时,需要生产者指明,这个消息的topic是什么(生产者不指定topic,Kafka内部也会创建默认的topic),Kafka内部帮你们分类管理,而消费者消费时,只需要告诉Kafka,想消费哪个topic的消息,Kafka就只会给他这个topic的数据,其他topic的不用关心,他也消费不了。
topic翻译过来是:主题,也可以理解为类型、标记...... 他的作用就是Kafka分类管理消息的依据。
所以站在topic的角度来看,此时的Kafka应该是这样的:
回答问题1
因为Kafka与redis或zk的不同点是,redis和zk里的数据是无属性的,说白了client连上就能操作所有的东西,数据是对所有client共享的(忽略某些权限控制等因素),不然为什么用redis或zk作为分布式锁的解决方案。
但是Kafka里的数据是有属性的,是有topic的,你不消费的topic里的数据你永远也拿不到。
所以我们回答Kafka中的消息数据是怎么存储的,需要站在一个topic的角度,
即:一整个topic的数据,在Kafka中是怎么存储的?
答案:类似redis cluster,每个partition里有一部分,全部加起来,才是一个完整的topic的数据。
partition是什么
如图,我们看到,broker0和broker1这两个实例都有一部分属于topicA的数据,他们加起来就是完整的数据。
那么紧随topic后面的partition是什么意思呢?
partition翻译过来:隔板墙;分割;分治;瓜分。你就理解为分区就行了。
和其他集群中的分区概念差不多,就是说,既然数据被化整为零了,那总要知道哪一块的数据