Kafka-Java二:Spring实现kafka消息发送的ack机制

写在前面

如果只有一个kafka实例的话,那么文章中提到kafka集群=kafka实例

一、什么是消息发送者端的ack机制

**ack机制:**消息确认发送成功的标识

**由谁发起该标识:**kafka集群

**发起该标识的场景:**kafka集群确认已经收到了消息。

**由谁接收该标识:**消息发送者端

**接收该标识的意义:**消息发送者接到该标识,才表示消息发送成功。

二、消息发送者端ack机制的策略有哪些

2.1、ack=0

kafka集群不需要任何broker收到消息,就立即返回ack给生产者。

该模式最容易丢失消息,但效率最高

2.2、akc=1

kafka默认的ack机制策略

kafka集群中,Leader的broker收到了消息,并且把消息写入到了log文件中,此时才返回ack给kafka。

该模式性能和安全性是最均衡的。

2.3、ack=-1/all

配置文件中的min.insyc.replicas=2(默认为1,推荐配置2)将生效。

min.insyc.replicas=n:当kafka集群接受到消息以后,当kafka集群完成了n个broker(包含Leader和follower)上的备份以后,再回复ack。

该模式最安全,但性能最差

三、消息发送失败的重试策略

消息发送失败会重试,重试的默认时间是100ms,重试的默认次数是3。

重试保证了消息的可靠性,但也可能造成消息的重复发送,比如说网络抖动。

所以需要在消费者做好消息接口的幂等性操作

四、通过Java设置kafka的ack机制和重试策略

java 复制代码
Properties props = new Properties();
        // 一、设置参数
        // 配置kafka地址
//        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
//                "192.168.151.28:9092"); // 单机配置
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                "192.168.154.128:9092,192.168.154.128:9093,192.168.154.128:9094"); // 集群配置
        // 配置消息 键值的序列化规则
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        // 配置生产者发送消息的ack机制
        /**
         * ack=0:
         *   kafka集群不需要任何broker收到消息,就立即返回ack给生产者。
         *   该模式最容易丢失消息,但效率最高
         * akc=1:(kafka默认的方式)
         *   kafka集群中,Leader的broker收到了消息,并且把消息写入到了log文件中,此时才返回ack给kafka。
         *   该模式性能和安全性是最均衡的。
         * ack=-1/all:
         *   默认配置文件中的min.insyc.replicas=2(默认为1,推荐配置2)将生效。
         *   min.insyc.replicas=n解释:当kafka集群接受到消息以后,当kafka集群完成了n个broker(包含Leader和follower)上的备份以后,再回复ack。
         *   该模式最安全,但性能最差
         */
        props.put(ProducerConfig.ACKS_CONFIG,"1");

        // 配置消息发送时间(未接收到ack)的重试次数和重试间隔时间
        /**
         *  消息发送失败(即没有收到ack)的重试次数和重试间隔
         *   消息发送失败会重试,重试的默认时间是100ms,重试的默认次数是3.
         *   重试保证了消息的可靠性,但也可能造成消息的重复发送,比如说网络抖动。所以需要在消费者做好消息接口的幂等性操作
         */
        props.put(ProducerConfig.RETRIES_CONFIG,"3");
        props.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG,"300"); // 重试间隔
相关推荐
あ-4 小时前
kafka broker迁移
kafka
小蒜学长4 小时前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
凤山老林4 小时前
轻量级规则引擎落地:Spring Boot 集成 LiteFlow 实现动态业务编排与热更新
java·spring boot·后端·规则引擎·liteflow
海兰4 小时前
【 Kafka进阶5】使用 Docker 部署 Apache Kafka 集群完全指南
docker·kafka·apache
夏贰四4 小时前
管控数据加载调度如何规避任务冲突?数据加载运维监控体系该如何搭建?
java·大数据·运维
山甫aa4 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
鱼鳞_5 小时前
热门八股-JVM
java·jvm
ly76895 小时前
XML 从入门到实践:语法、命名空间、XPath、XSD 与 Java 安全解析
xml·java·python
长谷深风1115 小时前
好的 Tool Schema,不是字段越全越好
java·大数据·人工智能·ai agent·agent工作流·智能体设计·ai产品设计
IT 行者5 小时前
用 HiddenHttpMethodFilter 解决浏览器不支持 PUT/DELETE/PATCH 的问题
java·spring