当前位置: 首页 > ds >正文

kafka 发送消息有哪些模式?各自的应用场景是什么?

Kafka 生产者发送消息主要有三种模式,这些模式的核心区别在于对消息成功发送的确认程度,这直接影响到消息的可靠性、吞吞吐量和延迟。这三种模式由生产者的 acks 参数控制。

以下是这三种模式的详细说明及其应用场景:

1. 发后即忘 (Fire-and-Forget)

这种模式也被称为“最多一次”投递(At Most Once)。

  • 配置: acks=0
  • 工作方式: 生产者将消息发送出去后,不会等待来自 Broker 的任何确认响应。它不关心消息是否被 Broker 成功接收,也不会进行任何重试。
  • 优点:
    • 延迟最低: 因为不需要等待网络往返的确认信息。
    • 吞吐量最高: 生产者可以以网络允许的最快速度发送消息。
  • 缺点:
    • 可靠性最低: 消息有丢失的风险。如果 Broker 在接收到消息时宕机,或者网络出现瞬时故障,这条消息就永远丢失了。
  • 应用场景:
    • 可以容忍少量数据丢失的场景: 例如,日志收集、指标监控、用户行为追踪等。在这些场景下,丢失个别数据点对整体分析影响不大。
    • 对性能和吞吐量要求极高,而对可靠性要求相对较低的场景

2. 同步发送 (Synchronous)

这种模式提供了“至少一次”投递(At Least Once)的保证。

  • 配置: acks=1 (这是默认配置)
  • 工作方式: 生产者发送消息后,会等待分区的 Leader 副本成功将消息写入其本地日志后返回确认。只要收到了 Leader 的确认,生产者就认为消息发送成功了。
  • 优点:
    • 可靠性较高: 相比 acks=0,这种模式确保了消息至少被 Leader 副本接收。
    • 性能和可靠性的良好平衡: 它在延迟和吞吐量方面表现适中。
  • 缺点:
    • 仍有较低的数据丢失风险: 如果 Leader 副本成功写入消息并向生产者发送确认后,但在 Follower 副本同步数据之前,Leader 宕机了,那么这条消息就会丢失。当新的 Leader 被选举出来后,它并没有这条消息。
  • 应用场景:
    • 大多数常规业务场景: 这是最常用的一种模式,适用于绝大多数要求消息可靠传输,但能容忍极小概率数据丢失的场景。例如,常规的业务消息通知、非核心业务的数据传递等。
    • 对延迟有一定要求,但又不能完全忽略可靠性的场景

3. 异步发送 (Asynchronous with Full Acknowledgement)

这种模式提供了最强的“至少一次”投递(At Least Once)保证,也是实现“精确一次”(Exactly Once)语义的基础。

  • 配置: acks=all (或 acks=-1)
  • 工作方式: 生产者发送消息后,不仅需要等待 Leader 副本成功写入消息,还需要等待 ISR (In-Sync Replicas, 同步副本列表) 中所有的 Follower 副本都成功同步这条消息后,才会收到 Broker 的确认。
  • 优点:
    • 可靠性最高: 只要 ISR 中至少还有一个副本存活,消息就不会丢失,提供了最强的数据持久性保证。
  • 缺点:
    • 延迟最高: 因为需要等待多个 Broker 的确认,网络往返时间更长。
    • 吞吐量较低: 等待确认的过程会降低发送速率。
  • 应用场景:
    • 对数据完整性和可靠性要求极高的场景: 绝对不能容忍任何数据丢失。
    • 核心金融业务: 如交易、支付、订单处理等。
    • 关键业务数据处理: 如计费、结算等。

总结与对比

模式acks 配置可靠性延迟吞吐量适用场景
发后即忘acks=0最低最低最高日志收集、监控指标、用户行为分析
同步发送acks=1 (默认)较高适中适中大部分常规业务场景,如消息通知
异步完全确认acks=all / -1最高最高最低金融交易、核心订单系统、支付结算

选择哪种模式,完全取决于具体的业务需求。开发者需要在可靠性、性能(吞吐量和延迟)之间做出权衡,选择最适合当前应用场景的发送模式。

http://www.xdnf.cn/news/18307.html

相关文章:

  • 秋招笔记-8.17
  • Java 学习笔记(基础篇5)
  • 【OpenAI】 GPT-4o-realtime-preview 多模态、实时交互模型介绍+API的使用教程!
  • 宋红康 JVM 笔记 Day05|运行时数据区内部结构、JVM中的线程说明、程序计数器
  • RAID服务器
  • PDF处理控件Aspose.PDF教程:将 PNG 合并为 PDF
  • HTTP协议-4-浏览器是怎么抉择HTTP版本的?
  • 【Java基础】反射,注解,异常,Java8新特性,object类-详细介绍
  • 01.Linux小技巧
  • 「Flink」业务搭建方法总结
  • Chromium base 库中的 Observer 模式实现:ObserverList 与 ObserverListThreadSafe 深度解析
  • 《Python学习之第三方库:开启无限可能》
  • 【K8s】harbor安装与推送镜像
  • 104、【OS】【Nuttx】【周边】文档构建渲染:安装 Sphinx 扩展(上)
  • 【笔记】位错的定义和分类
  • K8s的命名空间需要创建吗
  • HAProxy使用方法以及和LVS区别
  • InfluxDB 开发工具链:IDE 插件与调试技巧(二)
  • 【DDIA】第十章:解析Reduce端连接与分组技术
  • 基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
  • Django 请求生命周期
  • 2025北京世界机器人大会 ​要点总结
  • 检索增强生成(RAG) 缓存增强生成(CAG) 生成中检索(RICHES) 知识库增强语言模型(KBLAM)
  • PPT生成视频的AI大模型应用技巧
  • 第4.3节:awk正则表达式详解-特殊字符
  • apisix负载均衡测试
  • Webrtc在项目中承担的角色
  • 决策树-信息增益(第二十三节课内容总结)
  • 第2章:进阶篇——第2节:索引
  • 从决策树基础到熵与信息增益