版权声明:路漫漫其修远兮,吾将上下而求索。 https://blog.csdn.net/Happy_Sunshine_Boy/article/details/86238027
为什么会有消息队列
- 解耦
- 扩展 能力
- 持久化
- 峰值处理能力
- 可恢复
消息队列种类
ActivaMQ
- 基于JMS规范
- 支持事务
KafKa
- 轻量级,不完全服从JMS
- 无状态代理
- 消费者分组:每个消费者属于一个分组,每个消息可以被多个分组获得,但在一个分组中只有一个消费者获得
- 主题和分区
KafKa架构介绍
- 生产者、消费者、Broker(代理)、Zookeeper
Topic
- KafKa用topic组织消息
- 每条消息都属于且仅属于一个Topic
- Producer发布数据时,必须指定该消息发布到哪一个Topic
- Consumer订阅消息时,也必须指定订阅哪个Topic的消息
- 一个Topic的消息可分布在一个或多个节点(Broker)上
- 一个Topic包含一个或多个Partition
Partition(类似磁盘目录) & segment(类似磁盘文件)
- 在KafKa的文件存储中,同一个topic下有多个不同的partition(每个topic有几个partition是在创建topic是指定的),每一个partition为一个目录,partition命名规则为<topic名称-有序序号>,第一个partition的有序序号为0,最后一个partition的有序序号是partition数量减1。比如:创建一个名为test的topic,有5个partition,则就有5个目录:test-0,test-1,test-2,test-3,test-4。
- 每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中,但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。默认保留7天的数据。
- segment file由两大部分组成,分别为index file和data file,此两个文件一一对应,成对出现,后缀为“.index”和“.log”分别为segment的索引文件和数据文件。
00000000000000000000.index
00000000000000000000.log
消息
- 记录只会被追加到segment中,不会被单独删除或者修改。
- 清除过期日志时,直接删除一个或多个segment,保留策略。
- 每个消息只属于一个并且只属于一个topic。
Consumer group
- 每个consumer只是consumer group中的一个进程。一个topic中的一条消息只能被consumer group中的一个consumer进程消费。也就是说,如果要求topic中中的某消息被多个consumer消费,则这些consumer必须在不同的consumer group中。
offset(偏移量)
- broker是无状态的,也就是说,在broker中不存储哪些消息被哪些consumer消费了,这些消费记录被设计存储在consumer中。consumer总是从一个特定的partition顺序地消费消息,并应答消费了的消息的offset。