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

时间:2019-01-16 14:05:38

标签: java apache-kafka apache-kafka-streams

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

我们对延迟有严格的要求,并且在消费群体重新平衡时,我们面临着过高的延迟问题。在我们的方案中,重新平衡将相对频繁地发生:滚动更新代码,扩展/缩减服务,容器被群集调度程序拖移,容器即将死机,硬件故障。

我们进行的首批测试之一是建立一个小型消费者群体,其中有4个消费者处理少量消息(每秒1K)并杀死其中一个消息;集群管理器(当前为AWS-ECS,可能很快会转向K8S)启动了一个新的集群管理器。因此,完成了不止一次的重新平衡。

我们最关键的指标是延迟,我们将其度量为发布者中的消息创建与订阅者中的消息消耗之间的毫秒数。我们看到最大延迟从几毫秒增加到了将近15秒。

LAG WAIT TIME

end to end latency

processed msgs/sec

我们还用一些滚动更新的代码进行了测试,结果更加糟糕,因为我们的部署尚未针对Kafka服务进行准备,并且引发了很多重新平衡。我们需要对此进行研究,但想知道其他人在以尽可能小的延迟进行代码部署/自动扩展时遵循什么策略。

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

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

我们需要改善重新平衡期间的延迟峰值。 有人可以给我们一些如何工作的提示吗?接触配置是否足够?我们需要使用一些具体的分区分配器吗?实施我们自己的?

在最小的延迟情况下,推荐的代码部署/自动扩展方法是什么?

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

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

1 个答案:

答案 0 :(得分:4)

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

要这样做:

在Kafka 1.1中,为了减少不必要的重新平衡,您可以增加组的会话超时,以使协调员对成员不发出心跳信号的反应变得“不太敏感”-请注意,自0.11开始,我们禁用了Leave.group请求。对于Streams的使用者(https://issues.apache.org/jira/browse/KAFKA-4881)为0,因此,如果我们有较长的会话超时时间,则离开组的成员将不会触发重新平衡,尽管重新加入成员仍会触发一个。再平衡少少总比没有好。

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

相关问题