一、kafka是一种消息中间件
消息中间件作用:提到消息中间件离不开下面三个方面
1、异步
2、解耦
3、削峰
异步,顾名思义,主逻辑(主接口)将需要做的工作抽象成消息发到消息中间件之后,不需要等待消息被消费者消费完成。主业务逻辑被拆分成接口需要做的工作以及下游消费后做的工作。
解耦:
我理解:异步是指将功能拆分成两块,解耦是指两块功能相互不影响。即:异步之后,如果一个功能被拆成两块,解耦就是让这两块互不影feng
削峰:
我理解:
3.1
高流量的时候一个接口响应的时间是接口的性能瓶颈。我们可以通过消息中间件一次或多次拆分的方式将一个功能拆成若干块,让主逻辑看上去快速完成工作(其实是部分工作)。这样减少了响应时间(减少了请求对主逻辑线程的占用时间),从而提高了性能。
3.2
如果流量特别高,可将请求拆分第一部分只做插入消息队列的操作,可以做到快速响应。而存在消息队列中的消息,可以后续的tomcat按照特定的消费算法(漏桶、令牌什么的),慢慢进行返回。从而达到削峰的效果。
二、卡夫卡消费模式:
1、1对1
点对点的通信,消息生产者发布消息到Queue队列中,通知消费者从队列中拉取消息进行消费。消息被消费之后则删除,Queue支持多个消费者,但对于一条消息而言,只有一个消费者可以消费,即一条消息只能被一个消费者消费。
2、订阅模式
即利用Topic存储消息,消息生产者将消息发布到Topic中,同时有多个消费者订阅此topic,消费者可以从中消费消息,注意发布到Topic中的消息会被多个消费者消费,消费者消费数据之后,数据不会被清除,Kafka会默认保留一段时间,然后再删除。
三、kafka的角色(内部定义的对象):
1、消息中间件的基本模型:
消息生产者 -> 中间件 -> 消息消费者
Producer:消息生产者,向Kafka中发布消息的角色。
Consumer:消息消费者,即从Kafka中拉取消息消费的客户端。
2、kafka定义的另外的概念:
Consumer Group:消费者组,消费者组则是一组中存在多个消费者,消费者消费Broker中当前Topic的不同分区中的消息,消费者组之间互不影响,所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。某一个分区中的消息只能够一个消费者组中的一个消费者所消费
Broker:经纪人,一台Kafka服务器就是一个Broker,一个集群由多个Broker组成,一个Broker可以容纳多个Topic。
Topic:主题,可以理解为一个队列,生产者和消费者都是面向一个Topic
Partition:分区,为了实现扩展性,一个非常大的Topic可以分布到多个Broker上,一个Topic可以分为多个Partition,每个Partition是一个有序的队列(分区有序,不能保证全局有序)
Replica:副本Replication,为保证集群中某个节点发生故障,节点上的Partition数据不丢失,Kafka可以正常的工作,Kafka提供了副本机制,一个Topic的每个分区有若干个副本,一个Leader和多个Follower
Leader:每个分区多个副本的主角色,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。
Follower:每个分区多个副本的从角色,实时的从Leader中同步数据,保持和Leader数据的同步,Leader发生故障的时候,某个Follower会成为新的Leader。
四、kafka与rabbitMQ、rocketMQ的区别(面试关键点)
重点一:kafka相对于rabbitMQ是天生的支持分布式MQ(拓展性好)
引入topic概念,一个topic有多个partition/queue,生产消息不是一条一条去推送到queue,有个缓存批次的概念,批量推送到topic。水平增加queue直接添加就行。
重点二:如果需要一个消息多个消费者消费(kafka怎么支持大数据)。
rabbitMQ会通过exchange把消息放到不同的queue里面,cosumer消费之后就删除queue里面的消息。rabbitMQ相当于将数据多次拷贝。
kafka可以实现0拷贝。自己的consumer维护一个offset,记录自己消费到的位置。
重点三:rocketMQ阿里开发,适用于互联网三高。
rocketMQ不考虑消息的有序性。接口处理有序性问题。
kafka消息是缓存批次级别推送,rocketMQ消息是记录级别的。
kafka基于olap,rockerMQ基于oltp事务级别。