十一、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. 第1节 kafka消息队列:11、kafka的数据不丢失机制,以及kafka-manager监控工具的使用;12、课程总结

    12.kafka如何保证数据的不丢失 12.1生产者如何保证数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到 如果是同步模 ...

  2. 消息队列,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 ...

  3. 没用过消息队列?一文带你体验RabbitMQ收发消息

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 先给大家说声抱歉,最近一周都没有发文,有一些比较要紧重要的事需要处理. 今天正好得空,本来说准备写SpringIOC相关的东西,但是发现想 ...

  4. 消息队列的作用以及kafka和activemq的对比

    背景分析 消息队列这个类型的组件一直是非常重要的组件,当经过两家企业后我就很坚信这个结论了.队列这种东西,最广泛的作用还是在于解耦,宽泛一点的说,它可以将不同部门的工作内容进行有效的整合,基于一个约定 ...

  5. 第1节 kafka消息队列:1、kafka基本介绍以及与传统消息队列的对比

    1. Kafka介绍 l  Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目. l  Kafka最初是由LinkedIn开发,并于20 ...

  6. 第1节 kafka消息队列:2、kafka的架构介绍以及基本组件模型介绍

    3.kafka的架构模型 1.producer:消息的生产者,主要是用于生产消息的.主要是接入一些外部的数据源,从外部获取数据,比如说我们可以从flume获取数据,还可以通过ftp传入数据等,还可以通 ...

  7. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息

    组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...

  8. 高性能消息队列(MQ)Kafka 简单由来介绍(1)

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动作(网页浏 ...

  9. 消息队列高手课 -笔记-Kafka高性能的几个关键点

    总结下kafka 高性能的几个关键点是: 1:使用批量处理的方式 去提升系统的吞吐能力 2:基于磁盘文件高性能的顺序读写的特性来设计存储结构 3:利用操作系统的PageCache 来缓存数据  减少I ...

  10. 第1节 kafka消息队列:7、kafka的消费模型

随机推荐

  1. 当 EDA 遇到 Serverless,亚马逊云科技出招了

    近二三十年来,软件开发领域毫无疑问是发展最为迅速的行业之一. 在上个世纪九十年代,世界上市值最高的公司大多是资源类或者重工业类的公司,例如埃克森美孚或者通用汽车,而现在市值最高的公司中,纯粹的软件公司 ...

  2. 第六章:Django 综合篇 - 17:CSRF与AJAX

    CSRF(Cross-site request forgery)跨站请求伪造,是一种常见的网络攻击手段,具体内容和含义请大家自行百度. Django为我们提供了防范CSRF攻击的机制. 一.基本使用 ...

  3. ProxySQL查看所有的全局变量及更新操作

    mysql> select * from global_variables; +--------------------------------------------------------- ...

  4. 一条命令查看docker容器的ip地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' ID/container_name

  5. 第二章:视图层 - 10:动态生成PDF文件

    可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...

  6. MySQL集群搭建(5)-MHA高可用架构

    1 概述 1.1 MHA 简介 MHA - Master High Availability 是由 Perl 实现的一款高可用程序,出现故障时,MHA 以最小的停机时间(通常10-30秒)执行 mas ...

  7. 在K8S中安装jenkins

    以 NFS 为存储卷的示例,将在 NFS 存储卷上创建 Jenkins 目录,然后创建 NFS 类型的 PV.PVC. 1.NFS 存储卷创建 Jenkins 目录 进入 NFS Server 服务器 ...

  8. 使用 kubectl 执行 Rolling Update(滚动更新)

    Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机.新的 Pod 将在具有可用资源的 Node(节点)上进行 ...

  9. 220722 T2 序列(ST表+分治)

    题目描述 小 B 喜欢玩游戏. 有一天,小 B 在玩一个序列上的游戏,他得到了正整数序列{ai}以及一个常数c . 游戏规则是,玩家可以对于每一个ai 分别加上一个非负整数x ,代价为 x2,完成所有 ...

  10. Magnet: Push-based Shuffle Service for Large-scale Data Processing

    本文是阅读 LinkedIn 公司2020年发表的论文 Magnet: Push-based Shuffle Service for Large-scale Data Processing 一点笔记. ...