添加消息的依赖
<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 消息:
概念:高吞吐量的分布式发布订阅消息系统,
特点:处理消费者规模的网站中的所有动作流数据,具有高性能,持久化,多副本备份,横向扩展能力,,,等
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,用来保存集群的元信息,确保系统的可用性。
重点来啦:
工作流程分析:
注意:消息写入leader后,follower 是主动的去 leader进行同步操作的,Producer采用push的方式将数据发布到broker 中,并对每条消息追加到分区中,依次顺序写入磁盘中,以此保证统一分区内的数据是有序的,
如上图:数据在不同的分区中,可能会问没为什么要分区,目的又是什么,
分区的主要目的: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