- 点对点消息模型:点对点消息模型特点为,一个消息对应一个消费者,也就是说,一个消息只能被一个消费者所消费,消息一但被消费,那么消息将会从队列中删除,列如 rabbitmq就是典型的 点对点消息模型 案例发布订阅消息模型:发布订阅模型特点为,一条消息可以被一个,或者多个消费者所消费,只要订阅,就可以消费消息(需要注意在kafka中,有消费者组的概念,某一个分区的消息,只能被同一个消费者组中的 一个消费者所消费,也就是说:假如一个消费者组中有三个消费者,那么这三个消费者中只能有一个可以消费某个分区中的消息,如果想让每个消费者都可以接收到消息,那么你必须将这三个消费者都归属于不同的组之内)
kafka是一个基于发布订阅消息模型,并且是一个 分布式,集群 的消息中间件
kafak topic 主题的概念在kafka中, 主题就相当于一个分类,这样的话,消息的生产者 就可以将不同的消息发送到不同的topic主题中,分门别类,这样不同的消费者根据自己的需要,订阅不同的主题去消费消息即可(其实也可以理解为 就是一个“队列”,消息被发送到不同的队列中,消费者根据自己的需要订阅不同的队列)
kafka中 分区的概念kafka 为分布式集群的消息中间件,擅长处理大数据集,并且kafka的消息是需要存储在磁盘上的(尽快kafka有消息过期,自动删除机制),那么磁盘肯定是有瓶颈的。那一台服务器如果存储不下怎么解决呢?
分区的概念:举个例子,假如我有1000T的数据需要存储,这个时候一台机器肯定是存储不了,这个时候,就可以考虑进行分区,我拿10台机器,每一台机器存储100T,这样就可以解决这个问题
在kafka中,topic 可以理解为是一个逻辑的概念,一个topic 可以分为至少一个或者多个分区(当然如果你kafka只有一台机器,那配置一个分区也没什么问题,但是在生成环境中,kafka一般都以集群部署的方式出现,比如说有三台集群,那么就可以配置三个分区,三个副本,这种情况,消息的发送者,会把消息发送到其中某一个分区中,也就是数据最终会存储某个机器上)
每一个分区其实都是对应 服务器上的一个文件夹,也就是说消息发送到分区之后,都放在这个文件夹中后缀为.log的日志文件中了,这个文件就是真正存放消息的文件,分区又分为一个或多个 segment段(这个取决于此分区数据量的大小,当log文件的大小达到一定程度之后,就会重新生成新的一个segment段,一个segment段由一个.log文件,和一个.index 文件组成,默认刚开始会生成一个00000.log文件,个00000.index文件,这是第一个segment段,那随着数据量的不断增加,00000.log文件中的数据达到一定程度之后,就会重新生成新的segment段,新的文件名命规则为,此分区最后一个消息的offset(此消息id)来名命.log 和.index 文件)
每一个分区都是一个,有序的,不可变的消息序列,消息就跟排队一样,一直往里面塞
在kafka 中,保证消息 在一个分区内的有序性,但不保证 不同分区消息的有序性,因为消息到分区的发送都是异步的,所以不同分区不保证有序性
分区中的每一条数据都会被分配一个连续的id值(offset),来标识 这条消息在分区中的位置
分区的重要作用分区可以提升并行处理的能力,向一个主题发送的消息,会发送给这个主题所拥有的不同的分区中,这样消息可以达到并行发送处理,由多个分区来同时接收消息,提高kafka吞吐量
借助于分区,可以实现kafka服务的水平扩展,对应一台机器来说,无论是物理机还是虚拟机,其资源能力都是有限的,单一台机器达到上线之后,无法进行水平扩展,利用分区,可以把一个主题的消息,分散到不同的kafka server上(分区上),这样,资源不足时,就可以增加kafka集群的机器,然后在新的机器上创建分区就好了
segment 段一个分区partition 是由一个或多少segment 段构成的,分区在物理上的体现是一个文件夹,而segment 段 则是这个文件夹中的 .log 和 .index文件,消息最终是存储在segment 段的log日志文件中,当日志文件超过一定大小之后,日志文件就会就行裂变,生成新的.log 和.index 文件(新的segment段,文件名称生成策略为,上一个.log文件中最后一条消息的offset 来名命文件)来存储新的消息,以此类推
分区和段的关系:分区 由一个或多个 segment段构成(取决于此分区数据量的大小),消息最终是存储在 segment段的日志文件中,日志文件中的消息什么时候过期,取决于kafka配置文件的参数(消息过期,删除消息,释放磁盘空间)
消费者组
在kafka中由消费者组的概念,一个消费者只能归属于一个组,一个组可以由多个消费者,这样做的好处是,可以让 kafka 灵活 做到 单播 还是 广播 。利用kafka 提供 某一个分区的消息,只能被同一个消费者组中的 一个消费者所消费 这个机制,需要广播的时候,那么就让消费者各自拥有不同的组,需要单播,那就把消费者 放到同一个组里



