【中间件】 Kafka

1.先导知识:

  • 消息队列MQ(Message Queue): 将需要传输的数据临时(设置有效期)存放在队列中,进行存取消息
  • 消息队列中间件: 用来存储消息的中间件(组件)

2.消息队列的应用场景

异步处理

复制代码
##### 为什么要使用消息队列?

* 比较耗时的操作放在其他系统中,通过消息队列将需要处理的消息进行存储,其他系统可以消费消息队列中的数据
复制代码
###### 案例: 用户注册,后端一方面需要保存用户信息;另一方面需要发送短信,发送邮箱等需要连接第三方服务,需要额外等待一段时间

* ![](https://i-blog.csdnimg.cn/direct/487dae602fad4e049d6e386c1b47bd33.png)
复制代码
##### 常见的异步处理:

* 下载报表

系统解耦

复制代码
##### 为什么要使用消息队列?

* 原先一个微服务调用接口去调用另一个微服务,耦合比较严重,只要接口发生变化就会导致系统不可用。使用消息队列可以进行解耦,第一个微服务可以将消息放入到消息队列,另外一个微服务去处理。
  • 案例:系统之间的依赖即耦合度

流量削峰

复制代码
##### 为什么要使用消息队列?
    • 因为消息队列是低延迟,高可靠,高吞吐,可以应对大量并发。先接收大量用户的请求放到消息队列,再使用业务处理程序进行处理。

日志处理

复制代码
##### 为什么要使用消息队列?

* 临时存储大量用户信息
  • 案例: 记录分析用户行为,手机大量的用户访问信息

3.生产者,消费者模型

1.点对点模式
复制代码
###### 步骤:

* 消息生产者发送消息-\> MQ
* 消费者从MQ取出并消费
* MQ删除消息,不再存储
复制代码
###### 特点:

* 单个消息只有一个消费者
* 生产者和消费者之间无依赖性。生产者发送消息之后,不管消费者是否在允许,都不影响发送者下次发送消息
* 消费者消费之后需要向MQ应答,方便队列删除消息
2.发布订阅模式
复制代码
###### 步骤:

* 单个消息可以有多个订阅者
* 发布者和订阅者之间有时间依赖性。针对某个topic的订阅者,它必须创建一个订阅者之后,才能消费消息。
* 订阅者需要提前订阅该topic,并保持在线运行

4.Kafka

是什么?
  • Apache 软件基金会开发的一个开源流,分布式流平台。
    • 分布式的流平台的3个关键能力:发布和订阅数据流;以容错的持久化方式存储数据流;处理数据流
为什么用Kafka?
  • 支持生产者,消费者模型
  • 单机吞吐量是十万级
  • 消息延迟是毫秒级
  • 分布式可用型性高
  • 消息理论不会丢失
  • 支持事务
应用场景:
  • 建立实时数据管道,在系统/应用程序之间获取数据。
  • 构建实时流应用程序,转换/响应数据流
KafkaTool 图形界面工具
  • 是一个用于管理和监控 Apache Kafka 集群的图形界面工具
  • 官方网站: Offset Explorer
基本操作
  • 创建主题topic(实际工作中给开发要topic)类似Mysql的表
  • 生产者生产消息(以key,value键值对)到Kafka的topic中
  • 从Kafka topic取消息进行消费
    • 一个消费组中包含多个消费者,可以共同消费topic中的数据
    • 一个分区只能被一个消费者消费
Kafka幂等性
Kafkas生产者的分区写入策略
复制代码
###### 轮询分区(默认)

* ![](https://i-blog.csdnimg.cn/direct/1cbee190efcf4eedb2c7b093bf57607f.png)
* **触发条件** : 生产消息时key为null
  * 
复制代码
###### 按key分区

* ![](https://i-blog.csdnimg.cn/direct/b56e697b34eb4884b443468e1d628787.png)
* 触发条件: 生产消息时有key会根据分区数 按模运算
复制代码
###### 自定义分区
复制代码
###### 写入策略会存在乱序问题:

* 生产者是有写入策略,如果topic有多个分区,就会根据策略分配到不同partiton中存储,全局是乱序的;如果topic只有一个分区,消息是有序的。
Kafka消费者的分区分配策略:
复制代码
###### Range范围分配策略(默认)

* 按照topic维度,确保每个消费者消费的分区数量是均衡的

* ![](https://i-blog.csdnimg.cn/direct/ac36755f38484a019f568e45f80e72c5.png)
复制代码
*

5.如何测试消息队列?

https://blog.csdn.net/weixin_46697247/article/details/144804334

相关推荐
BYSJMG10 小时前
计算机毕设大数据方向:基于Spark+Hadoop的餐饮外卖平台数据分析系统【源码+文档+调试】
大数据·hadoop·分布式·python·spark·django·课程设计
小红帽2.012 小时前
GOFLY开源客服系统-处理gin框架下的session中间件
中间件·gin
PXM的算法星球13 小时前
ZooKeeper vs Redis:分布式锁的实现与选型指南
redis·分布式·zookeeper
THMAIL14 小时前
量化基金从小白到大师 - 金融数据获取大全:从免费API到Tick级数据实战指南
人工智能·python·深度学习·算法·机器学习·金融·kafka
寒士obj14 小时前
Redisson分布式锁:看门狗机制与续期原理
redis·分布式
Micrle_00714 小时前
java分布式场景怎么实现一个高效的 读-写锁
java·分布式
楠枬14 小时前
Curator 如何实现分布式锁
分布式·zookeeper
Badman14 小时前
分布式系统下的数据一致性-Redis分布式锁
redis·分布式·后端
Ray Song15 小时前
MCAP :机器人数据容器的全面实践指南
中间件·自动驾驶·dds·mcap
武子康18 小时前
Java-118 深入浅出 MySQL ShardingSphere 分片剖析:SQL 支持范围、限制与优化实践
java·大数据·数据库·分布式·sql·mysql·性能优化