使用2个消费者配置时,消费者吞吐量会降低

时间:2015-02-09 14:49:21

标签: spring spring-integration apache-zookeeper apache-kafka

使用spring-integration-kafka扩展和以下配置:

<int-kafka:zookeeper-connect id="zookeeperConnect"
    zk-connect="#{kafkaConfig['zooKeeperUrl']}" zk-connection-timeout="10000"
    zk-session-timeout="10000" zk-sync-time="2000" />

<int-kafka:consumer-context id="consumerContext" consumer-timeout="5000" zookeeper-connect="zookeeperConnect">
    <int-kafka:consumer-configurations>
        <int-kafka:consumer-configuration
                group-id="realtime-services-consumer-grp" 
                value-decoder="purchaseDecoder" 
                key-decoder="kafkaReflectionDecoder"
                max-messages="5" >
            <int-kafka:topic id="purchase" streams="1" />
        </int-kafka:consumer-configuration>
        <int-kafka:consumer-configuration 
                group-id="realtime-services-consumer-gw"
                value-decoder="eventDecoder" 
                key-decoder="kafkaReflectionDecoder" 
                max-messages="10" >
            <int-kafka:topic id="event" streams="1" />
        </int-kafka:consumer-configuration>
    </int-kafka:consumer-configurations>
</int-kafka:consumer-context>

<int-kafka:inbound-channel-adapter
    id="kafkaInboundChannelAdapter" kafka-consumer-context-ref="consumerContext"
    auto-startup="true" channel="inputFromKafka">
    <int:poller fixed-delay="20" time-unit="MILLISECONDS" />
</int-kafka:inbound-channel-adapter>

例如,当我评论第一个consumer-configuration时,我每分钟可以有300个事件没有问题。但是两者都被激活了。我的吞吐量非常低。来自这两个主题的吞吐量总和不到每分钟50个。

任何人都知道为什么我在阅读2个主题时表现不佳?我在配置中做错了什么?

1 个答案:

答案 0 :(得分:1)

感谢您指出这一点!

在与我当地的Kafka claster发生激烈争吵之后,我已经能够重现你的问题了,我为你做了一些解决方法: - )。

首先,它不是round-robin,而是逐个:

for (final ConsumerConfiguration<K, V> consumerConfiguration : getConsumerConfigurations().values()) {
    Map<String, Map<Integer, List<Object>>> messages = consumerConfiguration.receive();

如果consumerConfiguration目前没有任何消息,那么consumer-timeout="5000"期间每个KafkaStream都会被阻止。poll因此,来自<int-kafka:inbound-channel-adapter>的整个consumer-timeout="5000"任务被阻止,直到超时或甚至更糟:如果每个主题都没有消息,则整个等待超时是超时总和!

要解决此问题,您可以减少<int-kafka:consumer-context>或为每个主题提供多个<int-kafka:inbound-channel-adapter>,因此{{1}}。

是的,它看起来很奇怪,我们在发布之前没有时间看一下它是非常糟糕的,但无论如何都可以随意提出JIRA问题来修复它。

谢谢!