消息队列的主要功能
连接服务、消息路由、消息传递、数据持久化、日志记录
消息队列基本分类
1、点对点
生产者发送消息到队列中,消费者从队列中取出并消费。
消息在消费以后,队列中不再有存储,队列可以有多个消费者,但是一个消息只能被一个消费者消费
2、发布订阅模式
生产者发布消息到主题topic中,同时有多个消费者订阅topic,消息会被所有订阅者消费
Kafka介绍
1、没有中心主节点的概念,集群所有服务器对等,可以在不更改任何配置的情况下实现服务器的添加和删除,生产者和消费者也可以随意重启上下线
2、broker是kafka服务器,里面还有topic和partition的概念,topic即主题,用于建立生成者和消费者之间的订阅关系,生产者发送消息到指定的topic下,消费者从指定的topic消费消息
3、partition即消息分区,一个topic下会被划分为多个分区,可以同时放在多台服务器上,每个partition都是一个有序的队列,partition中的每条消息都会被分配一个有序的offset.
4、group即消费者分组,用于归类消费者,因为多个消费者可以共同消费一个topic下的消息,每个消费者消费一部分
5、offset偏移量,消费者需要知道消息在文件中的偏移量
一些特点
1、消息在broker中通过日志追加的方式进行持久化存储,并进行分区
2、消息首先会存入buffer中,当消息的个数或者大小达到阈值时,再进行刷盘
3、消息的冗余和可靠性是由分区副本机制来实现的,每个主题的分区可以配置多个副本并存储在不同的broker上,即使一个宕机,也可以选择一个新的副本来处理
4、broker不保存订阅者的状态,由订阅者自己跟踪和管理自己消费的偏移量,消费者可以选择在消费消息后立即提交偏移量,也可以在处理完成一批消息后批量提交
5、虽然broker不会主动管理consumer的offset,但是consumer会将offer存在broker的特殊主题中,使得消费者故障恢复时可以从上次提交的偏移量开始继续消费
6、正是由于broker不存储offset,因此消息的删除策略不能依赖于消费状态,而是依赖于时间的保留策略,默认保留七天,然后被删除,这是SLA策略,即服务水平保证
7、消息订阅者可以回滚到任意的位置重新进行消费,当订阅者故障时,可以选择最小的offset进行消息的重新读取
8、每条消息包含三个属性,即:offset(唯一标识)、messageSize(消息大小)、data(消息内容)
9、kafka基于文件存储,通过分区可以将日志内容分散到多个server上,以避免文件尺寸达到单机磁盘的上线,同样,通过划分分区可以容纳更多的consumer,提高消费能力。
10、每个partition只会被一个consumer消费,一个consumer可以消费多个partition,因此同一个group中,consumer的个数不能大于partition的个数
11、存储时会根据id和Offset建立稀疏索引,保证log文件的访问速度