官方说明是:
Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
提到了两个概念:
下边来理解一下这两个名词。
两个单词简写一下就是MQ,抛开消息不看,那就只剩队列了。
队列:是一种先进先出(FIFO)的数据结构。数据结构课程中有涉及这个概念~
消息队列可以简单理解为:把要传输的数据放在队列中。
我们把放消息的叫做:生产者;取消息的叫做:消费者。
例如:我们的系统中有一个A模块,B、C模块需要使用A模块提供的功能。如果A把提供的服务写入到消息队列中(生产者),B、C需要的时候就去队列里获取这个服务(消费者)。这样,三者的代码互相不浸入,完美实现了解耦合的需求。如果再来一个D模块,也要使用A的服务,它也只需去消息队列中取就ok了。如果B\C\D不需要A的服务了,直接不取消息就行了,减少了频繁改动代码的恶习。
总结一下就是:
A只负责提供服务,谁来消费,关我毛事?~
谁需要服务,谁就自己来拿,不需要就不拿。
以一个注册的例子来理解同步与异步的差异之处
节省了用户等待的时间,换句话就是减少了系统的响应时间~
这两个东西讲的是一个概念,可类比于在计算机网络课程中学习的数据链路层的流量控制功能。
例如:
? 系统的访问量特变大,假设每秒有3000个请求,而后台有两个服务器在同时工作,他们的工作能力是每秒处理1000个请求。那么可想而知,充分利用机器的情况下,也会出现剩余1000个请求无法处理的问题。
? 这1000个请求难道要丢弃掉?当然不阔以辽~ 这时候,消息队列又可以排上用场了:我们将收到的3000个请求全部放进消息队列,后边两台服务器来队列中取数据进行处理,也就缓解了整个系统的鸭梨~
1)点对点模式
消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
这是一种一对一的、消费者主动拉取数据的模式,消息被消费之后,就被从队列里清除,这种消费模式功能比较单一。
2)发布/订阅模式
消息生产者(发布)将消息发布到Topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到Topic的消息会被所有订阅者消费。
小总结:
基于这种模式,一条消息可以发给多个消费者;
发布订阅模式有两种:一种是队列推送消息,一种是消费者拉取数据;
造成的问题:推送消息的速度由队列决定,消费者的处理能力不一定,例如:生产100条/s,消费50条/s ,所以kafka采取的是消费者拉取的模式。当然拉取模式也有缺点:消费者需要频繁询问是否有消息等待消费[维护着一个长轮询] 。
注意哦:
(1)生产者和消费者leader,follower 只是个备份;
(2)同一个消费者组里的消费者不能消费同一个分区的数据,例如:同一个主题内只有2个数据分区,消费者组有3个消费者,那么第三个消费者只能空占资源,没有消费;
(3)kafka把消息存放在磁盘上,默认保留7天;
(4)zookeeper:首先kafka集群正常工作需要安装ZK,协助管理集群。只需要使得多个broker
公用一个ZK,就能使得它们组成集群工作。其次,消费者的消费偏移量保存在ZK里面;(0.9版本之前存在ZK,0.9版本之后存在本地)。
原文:https://www.cnblogs.com/simon-1024/p/11908748.html