从同一个JVM运行kafka使用者和生产者时生产缓慢

时间:2016-12-27 20:22:22

标签: java apache-kafka spring-kafka

我正在使用kafka 0.8和spring-integration-kafka 1.2.0.RELEASE

我有2个主题,分别是主要和次要。我需要从主要主题消费,经过一些处理需要生成次要主题,以便稍后进行下一组处理。

虽然主要主题的消费工作正常,但生成二级主题会在几分钟后开始失败。问题从我设置的500毫秒后发送请求到kafka超时开始。线程池耗尽时结束。

如果我尝试将事件生成到第二个主题到另一个kafka群集,它可以正常工作。

我有4个消费者在运行,两个主题各有200个分区。

我对卡夫卡不熟悉,请原谅任何缺乏知识。 请评论我应提供的任何遗漏信息。

2 个答案:

答案 0 :(得分:2)

使用所提供的信息有点难以理解,但我怀疑这个问题是您可以使用第一个主题,然后比第二个主题更快地计算结果。可能有很多原因导致这种情况发生。例如,对辅助主题的写入可能不是跨分区分布的。同样,生产到不同的集群可能会因各种原因而成功,包括更快的机器,更多的机器,更好的网络等。

基本问题不是特定于Kafka:如果您从一个来源消费并将该数据发送到第二个接收器,您通常不能认为第二个接收器总是比第一个接收器更快。每当第二个水槽较慢时,即使是一点点,你最终也会遇到这样的问题。例如,假设您可以从主要读取100个事件/秒,但次要接收器只能消耗99个事件/秒。这意味着每秒钟你最终会在内存中再发送一个等待发送到接收器的事件。如果你没有做任何事情来减慢你从主要来源读取的速度,那么你将耗尽RAM,线程或其他资源。

一般的解决方案是某种限制。例如,您可以使用以500个许可开头的Semaphore:这意味着您永远无法从主要来源读取超过500个尚未成功发送到接收器的项目。在从主要来源阅读项目之前,您将减少Semaphore,这样如果您已经“超过”次要的500项,您的读者将会阻止。每次成功将项目发送到辅助主题时,您都会发布许可证,允许继续阅读。

我会提醒您不要使用第二个Kafka集群或其他有效的修复工具但不能真正解决核心问题。例如,如果现在生产到不同的集群,那么当集群由于节点丢失,重新平衡等原因而减慢时,就不会这样做。这只会暂时隐藏这个问题。

答案 1 :(得分:0)

在尝试了所有可能的配置后,终于找到了问题。

错误地忘记删除之前为消费者集成添加的以下依赖项。

<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.9.0.0</version>

在生成时会导致一些冲突,即在等待状态下添加线程。如果任何人可以指导它可以添加的冲突将是一个很好的学习。

感谢。