消息中间件

常见的消息中间件有Active MQ , Rabbit MQ ,Rocket MQ, Kafka中,只有Active MQ完全实现了JMS的规范,Kafka则通过消费组和主题分区的方式让发布订阅模型同时也具有了点对点模式的消息收发能力。

 

一、kafka简介

1、Kafka是由Apache软件基金会开发的一个开源流处理平台,由ScalaJava编写,是一种高吞吐量的分布式发布订阅消息系统。

 

2、kafka基础架构

 

简单的说,就是生产者生产消息,kafka集群管理消息,消费者消费消息,zookeeper注册消息

 ZooKeeper是一种为分布式应用所设计的高可用、高性能的开源协调服务,提供了分布式锁服务,数据的维护和集群管理机制。

3、kafka名词解释

Producer:Producer即生产者,消息的产生者,生产message发送到topic,是消息的入口。

Consumer:消费者,即消息的消费方,订阅topic并消费message,是消息的出口。

Consumer Group:消费者组,一个Consumer Group包含多个consumer。

Broker:Kafka把服务器的物理机称为 broker(Kafka节点),一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群,Kafka集群能够同时负责多个topic的分发。

Topic:消息的主题,可以理解为消息的分类,每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic,在每个broker上可以创建多个topic。

Message:每一条发送的消息主体。

Partition:Topic物理上的分区,每个topic可以有多个分区,每个分区是一个有序的队列;分区的作用是做负载,提高kafka的吞吐量。

Segment:partition物理上由多个segment组成,每个Segment存着message信息。

Offset:指每个分区里的消息的唯一编号,并且是从0开始递增的。主题+分区+偏移量,可以唯一定位一条消息。

Zookeeper(分布式协调中心):kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。

replication:副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,副本存在于不同的节点broker上,且副本数小于节点broker的数,一个leader和若干个follower。

leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。

follower:每个分区多个副本中的“从k实时从leader中同步数据,保持和leader数据的同步。leader发生故障时,某个follower会成为新的leader,同一个partition的leader和follower不会存在于同一个Broker。

二、消息队列MQ

一般我们会简称它为MQ(Message Queue),“消息队列”是在消息的传输过程中保存消息的容器。
1、消息中间件的作用?
1)异步处理
2)应用解耦
3)流量削峰
2、消息中间件的缺点?
1)系统可用性降低
try...catch捕捉异常,直接进行数据库操作
搭建高可用kafka集群,搭建高可用Rabbit MQ ,Rocket MQ集群
2)系统复杂度提高
消息重复(网络抖动导致消息重复)
消息丢失(主要是Rabbit MQ容易出现)
消息的顺序不一致
3)消息不一致
使用分布式事务来控制
 
 
2、消息中间件的两种实现模式:
  • 点对点模式,消息的生产和消费者均只有一个,消息由生产者将消息发送到消息队列(queue)中,然后消息消费者从队列中取出消息进行消费,消息被取出后,queue中不再保存该消息。
  • 简单的说就是,生产者发送一条消息到queue,只有一个消费者能收到。
  • 发布订阅模式,消息的生产者和消费者可能有多个,使用主题(Topic)来对消息进行分类,生产者将消息发送到主题,多个消费者均可以对这个主题进行消费。类似于对多个消费者做广播。,,
  • 简单的说就是,发布者发送到topic的消息,订阅了topic的订阅者才会收到消息。
 
 
3、kafka工作过程:

 

  Kafka可以保证同一个partition分区内的消息顺序,但是无法保证跨分区的消息顺序,如果需要实现全局有序,需要采取一些额外的措施。

 

 4、测试需关注的kafka常见问题
1)生产者消息丢失问题
解决方法:
异步发送,通过“无消息丢失配置”极大降低丢失的可能性:
2)kafka消息重复问题
解决方法:
网络抖动导致 producer 误以为发送错误,导致重试,从而产生重复数据,可以通过幂等性配置避免。
2)Kafka消息乱序问题
Kafka可以保证同一个分区里的消息是有序的,即生产者按照一定的顺序发送消息,同理,消费者也会按照这个顺序来消费他们。
解决方法:
设置发送重试次数retries>0,同时把max.in.flight.requests.per.connections参数设为1
3)消费者消息丢失
消费者在消费完消息之后需要执行消费位移的提交
解决方法:
enable.auto.commit=false ,关闭自动提交位移,在消息被完整处理之后再手动提交位移
3)消费者消息重复消费
原因:数据已消费但offset没提交
解决办法:确保在消息处理完成后提交offset。可以考虑使用Kafka的事务功能来确保消息处理和offset提交的原子性。
 
5、kafka为什么要用partition?
1)方便扩展。
因为一个 Topic 可以有多个 Partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。
2)提高并发。  
以 Partition 为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
 
6、kafka如何保证发送的消息不丢失?
通过 ACK 应答机制!在生产者向队列写入数据的时候可以设置参数来确定是否确认 Kafka 接收到数据,这个参数可设置的值为 0、1、all。
 
7、partition结构

 

每个 Partition 的文件夹下面会有多组 Segment 文件。

每组 Segment 文件又包含 .index 文件、.log 文件、.timeindex 文件(早期版本中没有)三个文件。

Log 文件就是实际存储 Message 的地方,而 Index 和 Timeindex 文件为索引文件,用于检索消息。

8、message结构

消息主要包含消息体、消息大小、Offset、压缩类型……等等!

我们重点需要知道的是下面三个:

Offset:Offset 是一个占 8byte 的有序 id 号,它可以唯一确定每条消息在 Parition 内的位置!

消息大小:消息大小占用 4byte,用于描述消息的大小。

消息体:消息体存放的是实际的消息数据(被压缩过),占用的空间根据具体的消息而不一样。

 

 
 
9、如何测试?测试关注点?
如何测试:
1) 用kafkatools连接工具连接kafka
2)连上kafka后,可以按照Offset(偏移量),Key(消息key),Message(消息主体),Regex(正则表达式)进行单个或者组合查询
 
 
 
 
10、kafka,RabbitMQ,RocketMQ
1) 单机吞吐量:RabbitMQ 1.2W, RocketMQ 10W, kafka 100w
2)集群扩展支持
RabbitMQ不支持,RocketMQ和kakfa支持
3) RabbitMQ(支持死信消息,延迟消息) ,kafka 不支持 ,RocketMQ(支持死信消息、延迟消息、消息回溯、消息的过滤)
死信消息:消费了10次,20次都没有消费成功的消息,
对于死信消息,会进入一个单独的死信队列进行保存,后续可以手工处理,或者额外的处理
 
 

11、Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

 

 

 

 四、连接使用kakfa

1)kafka可视化连接工具:kafkatools

填写集群名称、Zookeeper 域名地址、端口、bootstrap servers进行连接

2)查看kafka中的数据

选择主题进行查看数据,Key和Message是二进制的,不能直观的看到具体的消息信息,需要设置展示格式为string

 

 

 过滤查询kafka消息:

可以按照Offset(偏移量),Key(消息key),Message(消息主体),Regex(正则表达式)进行单个或者组合查询

 

 

 

五、kafka的优势和劣势

1)优势

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒。
  • 可扩展性:kafka集群支持热扩展。
  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。
  • 容错性:允许集群中节点故障(若副本数量为n,则允许n-1个节点故障)。
  • 高并发:支持数千个客户端同时读写。

2)劣势

  • 系统可用性降低
  • 系统复杂度提高
  • 消息不一致
  • 消息延迟

 

六、kafka的应用场景

一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用。

1、日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer。
2、消息系统:即用作消息中间件。解耦生产者和消费者、缓存消息等。
3、用户活动跟踪:kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后消费者通过订阅这些topic来做实时的监控分析,亦可保存到数据库。
4、运营指标:kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
5、流式处理:自0.10.0.0 版本开始, Kafka 社区推出了一个全新的流式处理组件Kafka Streams 。这标志着Kafka 正式进入流式处理框架俱乐部。相比老牌流式处理框架Apache Storm 、Apache Samza,或是最近风头正劲的Spark Strearming,抑或是Apache Flink, Kafka Streams 的竞争力如何?让我们拭目以待。

 

 

posted @   不鸣则已一鸣惊人哈  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示