在项目中,由于要推送的消息很多,对消息队列使用kafka 的模式,第一次接触Kafka消息队列,想来,总结一下。


添加消息的依赖


<dependency> 

 
 
 <groupId>org.springframework.kafka</groupId> 

 
 
 <artifactId>spring-kafka</artifactId> 

 
 
 </dependency> 

 
 
 <dependency> 

 
 
 <groupId>io.projectreactor.kafka</groupId> 

 
 
 <artifactId>reactor-kafka</artifactId> 

 
 
 <version>1.1.0.RELEASE</version> 

 
 
 </dependency>

 


 


信息队列通信的模式---信息中间件


1》点对点模式


   点对点模式通常是基于拉取或者轮询的消息传送模式,(pull)主动的


特点:发送到队列的消息被一个且只有一个消费者进行处理。生产者将消息放入消息队列后,由消费者主动的去拉去消息进行消费。


优点:消费者拉取消息的频率可以由自己控制,消费者端需要额外的线程去监控消息是否消费。


 


 


 


2》发布订阅模式


发布订阅模式是一个基于消息送的消息传送模式,该模式可以由多种不同的订阅者,(push)被动接受


特点:生产者将消息放入消息队列后,队列会将消息推送给订阅过该类消息的消费者,消息队列无法感知消费者消费的速度,消息的处理速度不同,会出现自己的浪费问题


 


 


 


 


Kafka 消息:


概念:高吞吐量的分布式发布订阅消息系统,


特点:处理消费者规模的网站中的所有动作流数据,具有高性能,持久化,多副本备份,横向扩展能力,,,等




kafka 拉取指定offset的消息 kafka 推送和拉取_消息队列


Producer :生产者,消息的入口,


kafka cluster (kafka 群):


Broker:kafka的实例,每个服务器上有一个或多个kafka 实例,多个broker 在kafka集群中是不重复存在的,会被定义不同不得编号并使用。


Topic:消息的主题,对消息进行分类,kafka数据保存在Topic中,而且,Broker 可以创建多个Topic


Partition:Topic的分区。其作用:处理负载,提高kafka 的吞吐量,同一个Topic 的不同分区数据不重复。Partition相当于一个个的文件夹。


Replication:分区有多个副本,其作用是为了做备胎。当主分区(Leader)c出现故障时,会选择一个备胎(Follower)上位,,成为Leader,在Kafka中默认最大的副本量为10个,且副本的数量不能大于Broker 的数量,follower和Leader 绝对不能在同一个机器中,同一机器对同一分区只能存放一个副本(包括自己)


Message:发送的消息主体


Consumer:消费者,消息的出口,消费方。


Consumer Group:多个消费者组成一个消费组,同一分区的数据,被消费组中一个消费者消费,这样提高了kafka的吞吐量


Zookeeper:kafka集群依赖zookeeper,用来保存集群的元信息,确保系统的可用性。


 


 


 


重点来啦:


 


 


 


工作流程分析:



kafka 拉取指定offset的消息 kafka 推送和拉取_队列_02


注意:消息写入leader后,follower 是主动的去 leader进行同步操作的,Producer采用push的方式将数据发布到broker 中,并对每条消息追加到分区中,依次顺序写入磁盘中,以此保证统一分区内的数据是有序的,



kafka 拉取指定offset的消息 kafka 推送和拉取_kafka 拉取指定offset的消息_03


如上图:数据在不同的分区中,可能会问没为什么要分区,目的又是什么,


分区的主要目的:1》方便扩展,topic和partition是一对多的关系,可以使用扩展机器,轻松扩展数据量。


                           2》提高并发,以partition 为基本的读写单位,多个消费者可以同时消费数据,提高消费的处理效率。


同时也会有疑问:一个topic 有多个partition,producer 如何确认数据发向哪个partition ?


z在此提下kafka的几大原则:


1:partition 在写入的时候可以选择需要写入的partition,有指定,则写入指定的partition。


2:若没有指定,但是呢,设置可数据的key 值,则会根据key值hash 出一个partition,


3:若没有partition ,也没有key ,则会根据轮询选出一个partition 。


保证信息不丢失是一个消息队列中间件的基本保证,但如何确保呢?-----通过ACK应答机制,


在生产者向队列写入数据的时候,可以设置参数来确定是否确认kafka接收到数据,这个参数可以设置的值为0,1,all。


0:producer 往集群发送数据不需要等到集群的返回,不确保消息的发送成功。其安全性最低,但效率最高。


1:producer往集群发送数据只要leader应答就可以发送一条,只确保leader发送成功。


all:producer 往集群发送数据所有的follower 都完成从leader 的同步发送下一条,确保leader 发送成功何所有副本都完成备份,安全性高,但效率最低。


 


 


 


 


kafka的应用场景:


主要解决应用解耦,一步消息,流量消费等,实现高性能,高可用,可伸缩和最终一致性架构。存储转发


目前使用较多的消息队列,有Active MQ。BabbitMQ,ZeroMQ,kafka ,MetaMQ,rocket MQ


 


应用场景:


1:网站活动追踪,对消息进行实时处理,实时监测,离线处理数据仓库,或加载到Hadoop上


2:指标 用于监测数据,分布式应用程序生成的统计数据集中聚合


3:日志聚合:使用kafka代替一个日志聚合的解决方案


4:流处理:基于单个topic主题的实时数据流,


5:实践采集:是一种应用程序的设计风格,kafka支持非常大的存储日志数据的场景


6:提交日志:kafka可以作为一种分布式的外部提交日志,日志帮助节点之间复制数据。并作为失败的节点来恢复实践重新同步,kafka的日志压缩功能能制止这个用法。


k