热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kafka使用highapi如何确保不丢失消息,不重复发送,消息只读取一次

首先说明,Kafka的设计就是at-least-once的那么,如何确保非极端环境下,Kafka不丢数据,以及Kafka集群

首先说明,Kafka 的设计就是 at-least-once 的


那么,如何确保非极端环境下,Kafka 不丢数据,以及 Kafka 集群尽可能稳定呢?
  1. Producer 端设置 ack 为 all(或者说尽可能越多越好,但实际生产里集群实例过多,这样设置会影响性能,因此根据具体情况来定),即 确保所有 replication 都拿到数据的时候,send 方法才得以返回,以此来判断数据是否发送成功,那么理论上来说,此时发送成功的数据都不会丢失;
  2. unclean.leader.election.enable 设置为 false(默认参数为 true),意思是,当存有你最新一条记录的 replication 宕机的时候,Kafka 自己会选举出一个主节点,如果默认允许还未同步你最新数据的 replication 所在的节点被选举为主节点的话,你的数据将会丢失,因此这里应该按需将参数调控为 false;
  3. auto.offset.reset 参数设置为 earliest 避免出现 offset 丢失的时候,跳过需要消费的数据的情况,准确来说这里并非丢失,即使因为参数配置的问题出现跳过的情况,也可以通过前置 offset 找回历史消息;
  4. 数据持久化的时间需要设置业务足够接受的程度,我自己业务上使用就是能保证我的数据持久化时间为8个小时,超过8个小时的数据将被清空。

即使这样配置了,Kafka 在极端环境下也并非确保绝对不丢数据!!!


既然是极端环境的探讨,也就意味着能碰到的几率是非常低的,几率有多少我没统计过,其中第二种情况在业务中时常遇到。
  1. 根据 Kafka 官方文档说明,Producer 发送消息持久化到 Kafka 得到 ack 的回馈这段过程中,基于性能的考虑,Kafka 并没有及时把数据落盘的,而是将数据放到内存(FS cache)中,并周期性的落盘(从磁盘监控也可以看的出来),如果数据未及时落盘,如遇到服务器断电宕机,则数据丢失;
  2. 实际业务中,对数据可靠性较高的场景我建议手动提交 offset,自动提交 offset 会出现一个比较尴尬的情况,在业务应用被 kill 之前, A 消息的offset 可能被提交了,然而 A 消息在应用系统中尚未执行完毕,且状态都保存在了内存中,无法保留,此时重启应用将不会继续消费 A 消息,而是神不知鬼不觉的跳过。当然这种情况也并非算得上丢失数据,重置 offset 一样可以找的回来,但是手动提交 offset 可以避免这种诡异的情况发生。

Kafka HA 如何保障?
官方的意思是尽可能多节点集群部署,节点数尽可能大于等于3,并且 replication 数量也是大于等于3,那么当 replication 数量为 N 时,ack 设置为 all,这种情况下,就能确保 N-1台机子宕机的时候,数据仍能保持不丢。

另外补充,既然是at-least-once,肯定会出现重复消费的情况,这个不难解决,Consumer 保持无状态和幂等性就可以了。








1、不丢消息:producer有个ack参数,有三个值,分别代表:不在乎是否写入成功、写入leader成功、写入leader和所有reclpica成功;要求非常可靠的话可以牺牲性能设置成最后一种。
2、不重复发送:正常发都不会重复,只可能丢,看你这边怎么容错重发了,参考上一条。
3、消息只读一次:同样,正常读不会重复,如果在上一次读的过程中发生了异常,消息可能被消费,但是offset没有及时commit;这本身是两步,存在中间crash的风险。

Apache Kafka 官方文档上说,Kafka本身是不能保证“消息只读一次”,需要借助其他办法保证,比如2PC等,但是如果使用分布式事务的话,会影响吞吐量的。另外Kafka本身就是为了高吞吐量而设计的,如果非要保证“消息只读取一次”,可以使用JMS。
另外,说句题外话——每一个框架被设计的时候,都有考虑特定的使用场景的,比如Kafka就比较适合高吞吐量并且允许少量数据丢失的场景,所以一定要根据应用业务和使用场景来做技术选型




推荐阅读
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 讨伐Java多线程与高并发——MQ篇
    本文是学习Java多线程与高并发知识时做的笔记。这部分内容比较多,按照内容分为5个部分:多线程基础篇JUC篇同步容器和并发容器篇线程池篇MQ篇本篇 ... [详细]
  • 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路 ... [详细]
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 我正在使用sql-serverkafka-connect和debezium监视sqlserver数据库,但是当我发布并运行我的wo ... [详细]
  • ConsumerConfiguration在kafka0.9使用JavaConsumer替代了老版本的scalaConsumer。新版的配置如下:bootstrap. ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
author-avatar
LA_Lam霸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有