消息队列
概念
消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来存储消息的队列。我们可以简单理解消息队列就是将需要传输的数据存放在队列中。
应用场景
异步处理
电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,此时,就可以使用消息队列来进行异步处理,从而实现快速响应。
系统解耦
流量削峰
生产者、消费者模型
生产者:负责生产消息放到消息队列中。
消费者:负责处理消息队列中的消息。
Kafka的两种模式
点对点模式
流程
- 生产者生产消息,把消息发送到消息队列。
- 消费者消费消息队列中的消息,收到消息之后,告诉消息队列收到消息了。
- 消息队列把消息删除。
特点
- 每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
- 接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;
发布/订阅模式
该模式下生产者可以给不同的Topic发送消息,消费者也可以只消费特定Topic的消息,相比于点对点模式更加灵活。
流程
- 生产者向特定的主题Topic,发送消息到消息队列。
- 订阅了该Topic的消费者消费消息。
特点
- 可以有多个topic主题
- 消费者消费数据之后,不删除数据
- 每个消费者相互独立,都可以消费到数据
Kafka的基础架构
假设现在生产者需要将100T数据,发送到一个Topic的消息队列中,这显然是不现实的,因为一般服务器都存储不了100T的数据。
因此,kafka采用了分而治之的思想,将该一个Topic划分成几个Partition(分区),每个分区的消息交给一个broker(一个broker就是一台服务器)来存储,将100T的数据“平分”给每个broker的分区来存储。
虽然分区解决了Topic消息的存储问题,但是三个分区的消息,让一个消费者来消费,肯定也是处理不过来的。因此配合Topic分区的设计,顺势也提出了消费者组的概念。
消费者组由多个消费者组成,一个消费者组只处理一个Topic,一个Topic分区只能由组内的一个消费者来消费。
为了系统的可用性,kafka的还会为每个分区进行“备份”副本,而这个副本是保存在另一个broker里的。而每个分区还有leader和follwer之分,而且只有leader分区才会被用于消费者消费。
那“备份”副本有什么用呢?
比如,当下图中的broker0挂掉了,消费不了TopicA-Partition0这个分区的消息,那就只能去消费broker2中的“备份”副本分区了,并且broker2中的分区也会晋升为leader。
kafka通过zookeeper来记录谁是leader,因此kafka的安装也需要安装zookeeper。但是后续版本也开始不再只依赖zookeeper了。