【消息队列面试】11-14:kafka高可靠、高吞吐量、消息丢失、消费模式
十一、kafka消息高可靠的解决方案
1、高可靠=避免消息丢失
解决消息丢失的问题
2、如何解决
(1)保证消息发送是可靠的(发成功了/落到partition)
a.ack参数
发送端,采用ack机制
ack为0时,消息发送完就不管了
ack为1时,leader收到;如果leader宕机,会重新选举,丢失消息
ack为-1时,所有的follower全部同步完成(ISR同步完再返回)
b.unclean.leader.election.enable配置为FALSE,则会禁止ISR以外的follower被选举为leader
(被踢出来的)OSR是没有保持同步的,ISR是已经保持同步的节点
当跟上,又能进入ISR,是一个自动伸缩的
应当配置为FALSE,禁止没跟上的OSR中的节点选举
这种方式可能会降低可用性,但可以提高可靠性
c.重试次数tries>1
没收到,可以通过重试机制,确认发送到MQ中
d.最小同步副本数min.insync.replicas>1【与ack相互配置取得好的平衡】
把ack设置为or/-1时,效率没那么高,尤其是ISR节点多
可以配置此参数,不用同步全部的副本
保证消息不只在leade中有
没有满足此值时,不提供读写服务,写操作会产生异常
(2)保证消费端对是否成功消费敏感-配置offset手动提交
配置为手动提交offset,默认是自动提交
如果是自动提交,没有成功消费,处理失败,会丢失消息
处理完后,手动提交offset,确保消息是已经被消费过,不会产生丢失数据的问题
(3)消息成功落盘(保证节点可靠)-broker减少刷盘间隔
kafka写入pageCache,并从内部读出,由操作系统配置
如果停电,会丢失数据
使用sync函数,可以减少刷盘间隔
十二、kafka为什么比rabbitmq的吞吐量要高
生产者异步发送消息,并没有直接发送到broker,而是将消息发送到生产者
可以增加吞吐量
当消息积累到一定数量的时候,再批量发送至broker
但生产者宕机,消息会丢失,提高性能却降低了可靠性
十三、kafka消息丢失的场景及解决方案
高并发、高吞吐量的消息中间件
实际上,存在消息丢失的风险
1、丢失的场景
(1)发送端
存在的问题:
a.ack设置为0,性能高,但发送失败,消息就会丢失
b.当ack设置为1,只需要等待leader返回,就认为发送成功,有可能丢失消息(leader宕机)
c.leader节点宕机之后,在做follower的选举后,unclean.leader.election.enable配置为TRUE时,可能会从OSR中选举
ISR:节点的可靠性列表,其中的从节点和主节点数据可以保持一致,从节点滞后,就会被踢出到OSR中
解决方案:
a.ack设置的大一点,比如配置为all/-1(表示ISR中的所有节点),或者是2,3,可以保证leader返回就确认,为2时,表示至少要同步到一个从节点,重试次数tries>1
b.最小同步副本数min.insync.replicas>1,表示leader同步的时候,最少同步的follower节点数量,越大越可靠
副本数>1和ack通常搭配使用,最大程度保证消息的持久性
隐形逻辑关系:只有ack为-1或all时,最小同步副本数min.insync.replicas>1才会生效
c.失败的消息对应的offset要单独记录(遇到不可恢复异常要进行抛出)
(2)消费端
存在的问题:
先commit再处理消息,如果在处理消息时发生异常,offset已经提交了,这条消息对于消费者就是丢失了,再也不会被消费到
解决方案:
先处理消息,再进行commit,但可能存在重复消费的情况
(处理的过程中,消费者还没commit,就宕机了,就可能会产生重复消费的问题)
处理:先处理业务,再提交offset--》保证接口的幂等性,就不用担心重复消费
(3)消息在broker端的存储--broker的刷盘(由Linux保证page缓存)
Linux发生故障,应用端没有办法
间隔太长,容易丢失
减小刷盘间隔,保证消息一定能刷到pagecache中
十四、kafka是pull模式还是push模式,其优劣进行分析
1、含义
在consumer端拉取数据的模式
主动拉取pull(主要)☆☆☆☆☆-根据消费能力自己进行拉取
还是
推送到consumer-push
2、比较
(1)pull-由消费端主动拉取
优势:
可以根据消费能力拉取,从而可以控制速率,可以选择单条拉取或批量拉取
同时,可以设置不同的提交方式,可以设置手动提交offset,根据提交方式不同,控制传输方式的不同语义
缺点:
数据为空时,消费者不敏感,可能会导致空轮训,消耗CPU
解决:
通过参数设置,拉取数据为空或设置拉取的条数(10条),未达到就进行阻塞
(2)push-被动
优势:
不会导致consumer的服务等待,没有消息就不会做推送,并不会导致循环等待
缺陷:
无法保证速率,消费端可能会产生超时,并影响连锁反应、拒绝服务/网络拥塞,占用带宽
【消息队列面试】11-14:kafka高可靠、高吞吐量、消息丢失、消费模式的更多相关文章
- 第1节 kafka消息队列:11、kafka的数据不丢失机制,以及kafka-manager监控工具的使用;12、课程总结
12.kafka如何保证数据的不丢失 12.1生产者如何保证数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到 如果是同步模 ...
- 消息队列,RabbitMQ、Kafka、RocketMQ
目录 1.消息列队概述 1.1消息队列MQ 1.2AMQP和JMS 1.2.1AMQP 1.2.2JMS 1.2.3AMOP 与 JMS 区别 1.3消息队列产品 1.3.1 Kafka 1.3.2 ...
- 没用过消息队列?一文带你体验RabbitMQ收发消息
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 先给大家说声抱歉,最近一周都没有发文,有一些比较要紧重要的事需要处理. 今天正好得空,本来说准备写SpringIOC相关的东西,但是发现想 ...
- 消息队列的作用以及kafka和activemq的对比
背景分析 消息队列这个类型的组件一直是非常重要的组件,当经过两家企业后我就很坚信这个结论了.队列这种东西,最广泛的作用还是在于解耦,宽泛一点的说,它可以将不同部门的工作内容进行有效的整合,基于一个约定 ...
- 第1节 kafka消息队列:1、kafka基本介绍以及与传统消息队列的对比
1. Kafka介绍 l Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目. l Kafka最初是由LinkedIn开发,并于20 ...
- 第1节 kafka消息队列:2、kafka的架构介绍以及基本组件模型介绍
3.kafka的架构模型 1.producer:消息的生产者,主要是用于生产消息的.主要是接入一些外部的数据源,从外部获取数据,比如说我们可以从flume获取数据,还可以通过ftp传入数据等,还可以通 ...
- 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息
组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...
- 高性能消息队列(MQ)Kafka 简单由来介绍(1)
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动作(网页浏 ...
- 消息队列高手课 -笔记-Kafka高性能的几个关键点
总结下kafka 高性能的几个关键点是: 1:使用批量处理的方式 去提升系统的吞吐能力 2:基于磁盘文件高性能的顺序读写的特性来设计存储结构 3:利用操作系统的PageCache 来缓存数据 减少I ...
- 第1节 kafka消息队列:7、kafka的消费模型
随机推荐
- Kubernetes 多租户:Pod 安全策略
默认情况下,Kubernetes 允许创建一个有特权容器的 Pod,这些容器很可能会危机系统安全,而 Pod 安全策略(PSP)则通过确保请求者有权限按配置来创建 Pod,从而来保护集群免受特权 Po ...
- Prometheus中使用的告警规则
参考网站:https://awesome-prometheus-alerts.grep.to/rules 这个网站上有好多常用软件的告警规则,但是有些并不一定实用,有些使用起来会有错误,这里就把这些都 ...
- Linux下登陆MySQL时遇到报错"RROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) "
前言 作者在2021-07-21时遇到 linux下登陆MySQL时遇到报错"RROR 1045 (28000): Access denied for user 'root'@'localh ...
- 2_Docker
一. Docker介绍 1.1 引言 场景1: 我本地运行没问题啊 环境问题 场景2: 哪个哥们又写死循环了, 怎么这么卡 在多用户的操作系统下, 会相互影响 场景3: 淘宝在双11的时候, 用户量暴 ...
- OpenDataV低代码平台增加自定义属性编辑
上一篇我们讲到了怎么在OpenDataV中添加自己的组件,为了让大家更快的上手我们的平台,这一次针对自定义属性编辑,我们再来加一篇说明.我们先来看一下OpenDataV中的属性编辑功能. 当我们拖动一 ...
- SpringBoot课程学习(一)
@SpringBootTest指定测试的启动类 声明@SpringBootTest @Test注解 @Test 指定测试方法 @Order排序 一:先声明排序模式 @TestMethodOrder(M ...
- Nginx代理和动静分离
Nginx代理 微服务项目可能需要 Nginx来实现反向代理,用户请求 Nginx,随后 Nginx将请求转发至 Gateway网关,再由网关转至具体的微服务 一.动态代理 1.1 网关配置 针对使用 ...
- 2022.3.12 提高A组总结&反思
今天有点上头了 T1:开场秒,大水题,一眼莫队了,最后没打 T2:开场以为是费用流,后来发现费用流做不了,在做T3的时候突然发现可以状压,也没打 T3:这道题给我极大的亲切感,导致我一个上午硬钢这道题 ...
- 华为路由器RIP路由协议配置命令
RIP路由协议配置 rip 创建开启协议进程 network + ip 对指定网段接口使能RIP功能IP地址是与路由器直连的网段 debugging rip 1 查看RIP定期更新情况 termina ...
- java 入土--集合详解
java 集合 集合是对象的容器,实现了对对象的常用的操作,类似数组功能. 和数组的区别: 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 使用时需要导入类 Col ...