6-MQ篇-3

简介: Kafka是高性能分布式消息系统,项目中广泛用于异步通信,如内容审核、验证码发送、行为采集等。其高吞吐、解耦、削峰优势显著,但需通过合理分区(如Key哈希)、手动提交Offset、acks=all等机制保障不丢失、不重复、顺序消费。

Kafka

01- 你们项目中哪里用到了Kafka?

我们项目中很多地方都使用了Kafka, Kafka是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 :

  1. 通过Feign实现服务调用
  2. 通过Kafka实现服务通信

基本上除了查询请求之外, 大部分的服务调用都采用的是Kafka实现的异步调用 , 例如 :

  1. 发布内容的异步审核
  2. 验证码的异步发送
  3. 用户行为数据的异步采集入库
  4. 搜索历史记录的异步保存
  5. 用户信息修改的异步通知(用户修改信息之后, 同步修改其他服务中冗余/缓存的用户信息)
  6. 静态化页面的生成
  7. MYSQL和Redis , ES之间的数据同步
  8. 推荐数据实时计算
  9. .....

02- 为什么会选择使用Kafka? 有什么好处 ?

选择使用Kafka是因为Kafka作为中间件他的吞吐量比较高 , 我们的系统中主要使用Kafka来处理一些用户的行为数据 , 用户行为数据用户操作成本低 , 数据量比较大 , 需要有更高的吞吐量支持 , 并且我们在项目中需要实现根据用户行为的实时推荐 , 运营端后台管理系统首页看板数据的实体展示 !

使用Kafka有很多好处:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 调用间没有阻塞,不会造成无效的资源占用
  • 耦合度极低,每个服务都可以灵活插拔,可替换
  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

使用Kafka也有很多缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理
  • 需要依赖于Broker的可靠、安全、性能

03- 使用Kafka如何保证消息不丢失 ?

使用Kafka在消息的收发过程都会出现消息丢失 , Kafka分别给出了解决方案

  1. 生产者发送消息到Brocker丢失设置同步发送和异步发送
  • 同步发送可以通过get()获取到消息的发送结果 , 阻塞方案, 效率比较低
  • 异步发送可以通过回调获取到消息的发送接口 , 非阻塞方案, 效率较高 , 可能会出现回调丢失
  • 设置消息发送失败的重试次数, 设置为一个很大的值, 发送失败不断重试
  1. 消息在Brocker中存储丢失Kafka提供了分区的备份机制 , 可以为每个分区设置多个副本 , 主分区服务器宕机, 副本分区还有完整数据主分区数据同步到副本分区之前, 主分区宕机也有可能会出现消息丢失问题 , 解决方案就是设置消息确认的ACKS

确认机制

说明

acks=0

生产者在成功写入消息之前不会等待任何来自服务器的响应,消息有丢失的风险,但是速度最快

acks=1(默认值)

只要集群首领节点收到消息,生产者就会收到一个来自服务器的成功响应

acks=all

只有当所有参与赋值的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应

  1. 消费者从Brocker接收消息丢失消费者是通过offset来定位消费数据的 , 当消费者出现故障之后会触发重平衡, 会为消费者组中的消费者重新分配消费分区, 正常情况下是没有问题的 , 这也是Kafka提供的消费保障机制但是在重平衡的过程中 , 因为Kafka默认子每隔5S自动提交偏移量 , 那么就有可能会出现消息丢失和重复消费问题
  • 如果提交偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理。
  • 如果提交的偏移量大于客户端的最后一个消息的偏移量,那么处于两个偏移量之间的消息将会丢失。
  1. 解决方案有二种 :
  1. 设置更小的自动提交偏移量的周期 , 周期越小出现问题的概率也就越小, 对消费者性能和服务器压力的影响就越大(缓解方案,不能从根本上解决问题)
  2. 消费完毕手动提交偏移量
  1. 同步提交 : 会阻塞, 效率低 , 但是会重试 , 直到成功为止
  2. 异步提交 : 不会阻塞 , 效率高 , 但是不会重试 , 可能会出现提交失败问题
  3. 同步异步结合

通过Kafka本身所提供的机制基本上已经可以保证消息不丢失 , 但是因为一些特殊的原因还是会发送消息丢失问题 , 例如 : 回调丢失 , 系统宕机, 磁盘损坏等 , 这种概率很小 , 但是如果想规避这些问题 , 进一步提高消息发送的成功率, 也可以通过程序自己进行控制

设计一个消息状态表 , 主要包含 : 消息id , 消息内容 , 交换机 , 消息路由key , 发送时间, 签收状态等字段 , 发送方业务执行完毕之后 , 向消息状态表保存一条消息记录, 消息状态为未签收 , 之后再向Kafka发送消息 , 消费方接收消息消费完毕之后 , 向发送方发送一条签收消息 , 发送方接收到签收消息之后 , 修改消息状态表中的消息状态为已签收 ! 之后通过定时任务扫描消息状态表中这些未签收的消息 , 重新发送消息, 直到成功为止 , 对于已经完成消费的消息定时清理即可 !

04- 消息的重复消费问题如何解决的 ?

消费者是通过offset来定位消费数据的 , 当消费者出现故障之后会触发重平衡, 会为消费者组中的消费者重新分配消费分区, 正常情况下是没有问题的 , 这也是Kafka提供的消费保障机制

但是在重平衡的过程中 , 因为Kafka默认子每隔5S自动提交偏移量 , 那么就有可能会出现消息丢失和重复消费问题

如果提交偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理。

解决方案有二种 :

  1. 设置更小的自动提交偏移量的周期 , 周期越小出现问题的概率也就越小, 对消费者性能和服务器压力的影响就越大(缓解方案,不能从根本上解决问题)
  2. 消费完毕手动提交偏移量
  1. 同步提交 : 会阻塞, 效率低 , 但是会重试 , 直到成功为止
  2. 异步提交 : 不会阻塞 , 效率高 , 但是不会重试 , 可能会出现提交失败问题
  3. 同步异步结合

基于上面的操作如果因为网络原因, 服务器原因出现偏移量提交失败的情况 , 还是会出现重复消费 , 具体的解决方案其实非常简单, 为每条消息设置一个唯一的标识id , 将已经消费的消息记录保存起来 , 后期再进行消费的时候判断是否已经消费过即可 , 如果已经消费过则不消费 , 如果没有消费过则正常消费

05- Kafka如何保证消费的顺序性 ?

topic分区中消息只能由消费者组中的唯一一个消费者处理,所以消息肯定是按照先后顺序进行处理的。

但是它也仅仅是保证Topic的一个分区顺序处理,不能保证跨分区的消息先后处理顺序。

所以,如果你想要顺序的处理Topic的所有消息,那就只提供一个分区。

目录
相关文章
|
4天前
|
负载均衡 Java Nacos
5-微服务篇-2
Spring Boot核心注解为@SpringBootApplication,由@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan组成;跨域问题可通过@CrossOrigin注解、WebMvcConfigurer配置或网关(如Spring Cloud Gateway)统一处理;项目使用Spring Boot 2.3.4等主流版本及Nacos、Sentinel等云原生组件。
72 5
|
1月前
|
Linux 编译器 开发工具
Linux下Zlib安装与使用教程 (从入门到精通的Zlib压缩库开发指南)
本文参考:http://iyjla.cn详解Linux下Zlib压缩库的安装与使用:涵盖源码下载、编译安装(configure/make/make install)、头文件与库链接,以及基础C程序调用示例,助开发者快速掌握这一通用开源压缩工具。(239字)
|
2月前
|
存储 缓存 NoSQL
4-Redis篇-1
本文详解Redis在项目中的三大应用:热点缓存、业务数据存储(如验证码、排行榜)及分布式锁;涵盖5种基础数据类型、RDB/AOF双持久化机制、惰性+定期混合过期策略,以及8种内存淘汰策略。
169 19
|
4天前
|
人工智能 Linux API
全平台零门槛:Win11、Mac、Linux 通用 Hermes Agent 安装教程
Hermes Agent是Nous Research开源的自进化AI助手(MIT协议),越用越懂你。支持多工具并行、自动记忆习惯,Python编写,v0.13.0版。兼容Win/macOS/Linux/Docker,国内用户可配清华镜像快速部署,需API密钥(如Kimi)。
|
4天前
|
数据采集 JSON API
小红书笔记详情API实战总结(技术复盘)
本文为小红书笔记详情API实战复盘,涵盖OAuth2.0鉴权、代理与指纹配置避封、限流/风控应对等关键问题。详解note_id、access_token等核心参数及结构化返回字段(内容/媒体/互动/作者),助力竞品分析与内容监测。(239字)
|
6天前
|
人工智能 自然语言处理 机器人
[开源框架-实战]用 Hermes Agent 搭一个微信播报机器人
30 分钟,零 Python 代码,搭出一个每天早上 9 点把 GitHub Trending 推送到你微信的机器人。顺带把 Hermes 的 Skill、Gateway、Cron 四个招牌能力全用上。
190 8
|
4天前
|
SQL 关系型数据库 MySQL
MySQL慢查询诊断实战:从10秒到0.1秒,我的5步排障法
数据库小学妹分享慢查询优化实战:从10秒降至0.08秒!详解「发现→收集→分析→优化→验证」5步排障法,覆盖慢日志配置、EXPLAIN进阶、索引失效场景、JOIN与分页优化等核心技巧,附真实案例与速查表。
|
4天前
|
人工智能 自然语言处理 API
阿里云百炼Token Plan订阅方案:支持多模型灵活切换,兼容主流AI工具,多档位套餐,包月预算可控
阿里云百炼Token Plan团队版是面向企业及开发者的多模态AI订阅服务,采用Credits统一计量,支持Qwen3.6、Wan2.7、GLM-5、DeepSeek-V4、Kimi K2.6等十余款主流模型,兼容Qwen Code、Claude Code、OpenClaw等热门AI工具。提供标准版(198/月)、高级版(698/月)、尊享版(1,398/月)三档坐席,配套共享用量包(5,000/62.5万Credits)供弹性补额。计费按Token实际消耗抵扣,无频次限制,承诺不使用用户数据训练模型,多租户隔离保障稳定运行,适用于团队协作、开发办公等场景。
|
5天前
|
域名解析 缓存 网络协议
DNS 与 hosts 文件:Windows 11 中的名称解析配置
本文详解Windows域名解析机制,重点对比hosts文件(本地静态映射,优先级最高)与DNS(远程动态查询)的原理、配置及优先级顺序,并指导如何在Win11中修改hosts、刷新缓存、设置DNS服务器,涵盖开发测试、访问加速、广告屏蔽等实用场景。
|
5天前
|
机器学习/深度学习 IDE 数据挖掘
2026最新Jupyter Notebook安装使用保姆级教程(附安装包+图文步骤)
Jupyter Notebook是基于网页的交互式编程工具,支持Python、R等数十种语言。以单元格为单位执行代码,即时显示结果,融合代码、文字与图表,适合数据分析、教学及报告编写。推荐通过Anaconda一键安装。