Java 为什么在这个卡夫卡的例子中我只能看到所有其他的信息?
我试图修改其中一个,但得到的结果令人困惑——尽管我只为我的频道注册了一个流侦听器,但我只收到每一秒的消息。我怀疑这是由单个kafka分区的默认负载平衡引起的,但我不知道如何确认这一点 docker ps仅显示kafka broker启动的单个实例Java 为什么在这个卡夫卡的例子中我只能看到所有其他的信息?,java,spring,spring-boot,apache-kafka,spring-kafka,Java,Spring,Spring Boot,Apache Kafka,Spring Kafka,我试图修改其中一个,但得到的结果令人困惑——尽管我只为我的频道注册了一个流侦听器,但我只收到每一秒的消息。我怀疑这是由单个kafka分区的默认负载平衡引起的,但我不知道如何确认这一点 docker ps仅显示kafka broker启动的单个实例 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e058697a3bb2 wurstmeister/kafka "start-kafka.sh" 5 minutes ago Up 5 minutes 0.0.0.0:9092->9092/tcp kafka-uppercase-tx
d001389ddfa4 wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" 5 minutes ago Up 5 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp uppercasetransformer_zookeeper_1
检查kafka console使用者也会生成单一类型的响应,但这一次是BAR-only:
/opt/kafka_2.12-2.1.0/bin # ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic output
BAR
BAR
BAR
BAR
BAR
但是,检查消费者组描述和成员不会显示任何其他消费者,因此我的负载平衡理论在这里失败了:
/opt/kafka_2.12-2.1.0/bin # ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group anonymous.0559a5b9-7876-4523-8e6c-74eb03d305a3
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
input 0 0 0 0 consumer-2-955118a4-3597-48a3-8fdd-3823fc366068 /172.22.0.1 consumer-2
/opt/kafka_2.12-2.1.0/bin # ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group anonymous.0559a5b9-7876-4523-8e6c-74eb03d305a3 --members
CONSUMER-ID HOST CLIENT-ID #PARTITIONS
consumer-2-955118a4-3597-48a3-8fdd-3823fc366068 /172.22.0.1 consumer-2 1
我也看不出主题描述有任何错误:
/opt/kafka_2.12-2.1.0/bin # ./kafka-topics.sh --zookeeper zookeeper:2181 --describe --topic output
Topic:output PartitionCount:1 ReplicationFactor:1 Configs:
Topic: output Partition: 0 Leader: 1001 Replicas: 1001 Isr: 1001
为什么只有每一秒的消息被传送到我的输出通道,我怎么能自己检查呢
kafka-demo.java:
包装演示;
导入java.util.concurrent.AtomicLong;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.cloud.stream.annotation.EnableBinding;
导入org.springframework.cloud.stream.annotation.StreamListener;
导入org.springframework.cloud.stream.messaging.Processor;
导入org.springframework.context.annotation.Bean;
导入org.springframework.integration.annotation.InboundChannelAdapter;
导入org.springframework.integration.annotation.Poller;
导入org.springframework.integration.annotation.ServiceActivator;
导入org.springframework.integration.core.MessageSource;
导入org.springframework.messaging.support.GenericMessage;
@EnableBindingProcessor.class
公共类大写转换程序{
专用静态记录器Logger=LoggerFactory.getLoggerUppercaseTransformer.class;
@ServiceActivatorinputChannel=Processor.INPUT,outputChannel=Processor.OUTPUT
公共字符串转换字符串有效负载{
logger.infotransforming有效载荷{},有效载荷;
返回有效载荷.toUpperCase;
}
静态类TestSource{
专用AtomicLongSemaphore=新AtomicLong0L;
@豆子
@InboundChannelAdapterchannel=input,轮询器=@PollerfixedDelay=1000
公共消息源sendTestData{
返回->
{
最终长信号量值=longesmaphore.getAndIncrement;
最终布尔条件=信号量值%2==0;
最终字符串foobar=条件?foo:bar;
logger.infosemapherevalue:{},条件:{},foobar:{},信号量值,条件,foobar;
返回新的GenericMessagefoobar;
};
}
@StreamListenerProcessor.OUTPUT
公共无效接收字符串有效负载{
接收的logger.infoData:{},有效载荷;
}
}
}
日志:
application-local.yml:
spring:
cloud:
stream:
# bindings:
# output:
# destination: xformed
# test-sink:
# destination: xformed
# input:
# destination: testtock
# test-source:
# destination: testtock
default-binder: kafka
输出通道上有两个使用者—主题绑定和接收服务激活器
默认循环处理交替向服务激活器和主题发送消息。您的代码片段显示@StreamListener和./kafka-console-consumer.sh脚本的使用。它们是否可能在使用消息时相互干扰?当只有一个侦听器处于活动状态时,也会出现相同的情况。另外,另一个列表显示只有一个组成员,因此即使有多个侦听器,也应该对它们进行处理。作为多个侦听器组,我看不出这两个消费者来自哪里。您能详细说明一下吗?这两个消费者是您的接收方法,活页夹创建了一个消费者,该消费者通过绑定将记录发送给卡夫卡。消息将交替发送到每个服务器。如果要在同一应用程序中使用,则需要一个到输出主题的输入绑定。如果删除receive方法,您将在控制台使用者中看到所有消息。为什么首先自动创建输出通道的使用者?我看不出为什么绑定器应该创建出站频道的自动竞价。然后,我如何在应用程序的不同模块中使用消息?这就是我以@StreamListener的形式提供入站消息通道的原因,这就是重点;将消息发送到频道,框架将其发送到卡夫卡主题。通过在那里添加入站通道适配器,您正在滥用该框架-您正在绕过绑定器发送到该通道。通常,绑定从代理接收消息并将其发送到通道,您在该通道上有一个流侦听器。
spring:
cloud:
stream:
# bindings:
# output:
# destination: xformed
# test-sink:
# destination: xformed
# input:
# destination: testtock
# test-source:
# destination: testtock
default-binder: kafka