Kafka Streams 重新平衡高吞吐量 kafka-streams 服务上的延迟峰值

2023-12-22

我们开始使用 Kafka 流,我们的服务是一个非常简单的无状态消费者。

我们对延迟的要求很严格,当消费者组重新平衡时,我们面临着过高的延迟问题。在我们的场景中,重新平衡会相对频繁地发生:滚动更新代码、扩大/缩小服务、容器被集群调度程序洗牌、容器死亡、硬件故障。

我们所做的第一个测试是让一个由 4 个消费者组成的小型消费者组处理少量消息(1K/秒)并杀死其中一个;集群管理器(目前是 AWS-ECS,可能很快就会转向 K8S)启动一个新的集群管理器。因此,进行了不止一次的重新平衡。

我们最关键的指标是延迟,我们将其衡量为发布者中的消息创建和订阅者中的消息消费之间的毫秒数。我们发现最大延迟从几毫秒飙升至近 15 秒。

我们还进行了一些滚动更新代码的测试,但结果更糟,因为我们的部署没有为 Kafka 服务做好准备,并且触发了很多重新平衡。我们需要解决这个问题,但想知道其他人在以尽可能小的延迟进行代码部署/自动扩展时遵循的策略是什么。

不确定它是否有帮助,但我们对消息处理的要求相当宽松:我们不关心某些消息不时被处理两次,或者对消息的顺序非常严格。

我们使用所有默认配置,没有进行任何调整。

我们需要改善重新平衡期间的延迟峰值。 有人可以给我们一些关于如何处理它的提示吗?触摸配置就够了吗?我们需要使用一些具体的分区分配器吗?实施我们自己的?

以尽可能最小的延迟进行代码部署/自动扩展的推荐方法是什么?

我们的Kafka版本是1.1.0,在查看了例如kafka/kafka_2.11-1.1.0-cp1.jar的库后,我们安装了Confluence平台4.1.0。 在消费者方面,我们使用Kafka-streams 2.1.0。

感谢您阅读我的问题和您的回复。


如果差距主要是由重新平衡引入的,意味着不触发重新平衡,而是让 AWS / K8s 继续工作并恢复弹回的实例并支付弹跳期间的不可用时间 --- 请注意,对于无状态实例,这通常更好,而对于有状态应用程序,您最好确保重新启动的实例可以访问其关联的存储,以便可以节省从更改日志进行引导的时间。

要做到这一点:

在 Kafka 1.1 中,为了减少不必要的重新平衡,您可以增加组的会话超时,以便协调器对未通过心跳响应的成员变得“不那么敏感”——请注意,我们从 0.11.0 开始为 Streams 禁用了 Leave.group 请求'消费者(https://issues.apache.org/jira/browse/KAFKA-4881 https://issues.apache.org/jira/browse/KAFKA-4881)因此,如果我们的会话超时时间较长,则离开组的成员不会触发重新平衡,但成员重新加入仍会触发重新平衡。不过,少一次重新平衡总比没有好。

不过,在即将到来的 Kafka 2.2 中,我们在优化重新平衡场景方面做了很大的改进,主要体现在 KIP-345 中(https://cwiki.apache.org/confluence/display/KAFKA/KIP-345%3A+Introduce+static+membership+protocol+to+reduce+consumer+rebalances https://cwiki.apache.org/confluence/display/KAFKA/KIP-345%3A+Introduce+static+membership+protocol+to+reduce+consumer+rebalances)。通过 KIP-345 中引入的合理配置设置,滚动反弹会触发更少的重新平衡。所以我强烈建议您升级到2.2,看看它是否对您的情况有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kafka Streams 重新平衡高吞吐量 kafka-streams 服务上的延迟峰值 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐