Docker 融合平台无法将消息正确发送/使用到卡夫卡主题中

Docker 融合平台无法将消息正确发送/使用到卡夫卡主题中,docker,apache-kafka,confluent-platform,Docker,Apache Kafka,Confluent Platform,目前,我将Maven与io.fabric8 docker Maven插件一起使用,以便自动启动Kafka和ZooKeeper。这是我当前的配置,工作正常: <properties> <zookeeper.port>2181</zookeeper.port> <kafka.host>127.0.0.1</kafka.host> <kafka.port>9092</kafka.port> &

目前,我将Maven与io.fabric8 docker Maven插件一起使用,以便自动启动Kafka和ZooKeeper。这是我当前的配置,工作正常:

<properties>
    <zookeeper.port>2181</zookeeper.port>

    <kafka.host>127.0.0.1</kafka.host>
    <kafka.port>9092</kafka.port>
</properties>

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>${docker-maven-plugin.version}</version>

    <configuration>
        <showLogs>true</showLogs>
        <images>

            <image>
                <name>wurstmeister/zookeeper:${zookeeper.version}</name>
                <alias>zookeeper</alias>
                <run>
                    <ports>
                        <port>${zookeeper.port}:2181</port>
                    </ports>
                </run>
            </image>

            <image>
                <name>wurstmeister/kafka:${kafka.version}</name>
                <alias>kafka</alias>
                <run>
                    <ports>
                        <port>${kafka.port}:9092</port>
                    </ports>
                    <links>
                        <link>zookeeper:zookeeper</link>
                    </links>
                    <env>
                        <KAFKA_ADVERTISED_HOST_NAME>${local.ip}
                        </KAFKA_ADVERTISED_HOST_NAME>
                        <KAFKA_ADVERTISED_PORT>${kafka.port}</KAFKA_ADVERTISED_PORT>
                        <KAFKA_ZOOKEEPER_CONNECT>zookeeper:2181</KAFKA_ZOOKEEPER_CONNECT>
                        <KAFKA_MESSAGE_MAX_BYTES>15000000</KAFKA_MESSAGE_MAX_BYTES>
                    </env>
                </run>
            </image>

            <image>
                <name>confluentinc/cp-ksql-server:5.0.0</name>
                <alias>cp-ksql-server</alias>
                <run>
                    <ports>
                        <port>8088:8088</port>
                    </ports>
                    <links>
                        <link>kafka:kafka</link>
                    </links>
                    <env>
                        <KSQL_BOOTSTRAP_SERVERS>${local.ip}:9092</KSQL_BOOTSTRAP_SERVERS>
                        <KSQL_LISTENERS>http://0.0.0.0:8088/</KSQL_LISTENERS>
                        <KSQL_KSQL_SERVICE_ID>confluent_test_2</KSQL_KSQL_SERVICE_ID>
                    </env>
                </run>
            </image>

        </images>

    </configuration>
</plugin>
我可以在那里看到我的主题:

可能有什么问题,如何解决

已更新

我在应用程序中启用了Kafka上的调试日志,现在可以看到以下错误:

java.io.IOException: Can't resolve address: broker:9092
    at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235) ~[kafka-clients-1.1.0.jar:na]
    at org.apache.kafka.common.network.Selector.connect(Selector.java:214) ~[kafka-clients-1.1.0.jar:na]
    at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:793) [kafka-clients-1.1.0.jar:na]
    at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:230) [kafka-clients-1.1.0.jar:na]
    at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.sendEligibleCalls(KafkaAdminClient.java:792) [kafka-clients-1.1.0.jar:na]
    at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.run(KafkaAdminClient.java:1002) [kafka-clients-1.1.0.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
Caused by: java.nio.channels.UnresolvedAddressException: null
    at sun.nio.ch.Net.checkAddress(Net.java:101) ~[na:1.8.0_171]
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622) ~[na:1.8.0_171]
    at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233) ~[kafka-clients-1.1.0.jar:na]
    ... 6 common frames omitted
无法解析地址:broker:9092

卡夫卡正在回到它所知道的客户和听众那里

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092
基本上,
bootstrap.servers
只需要至少一个地址,但其余的Kafka集群地址将返回到客户端,以便与各个代理建立连接

当您在Docker网络外部连接到
localhost:9092
时,Docker端口转发将工作,但随后Kafka返回到您的客户端
broker:9092
,客户端将断开连接,因为您尚未在主机和Docker网络之间设置DNS(除非使用Docker Swarm,否则不需要设置)


您的解决方案将是两种选择

  • 在代码中使用
    localhost:29092
    ,事情可能会开始变得更好
  • 通过Compose文件在同一网络设置上的Docker容器中运行Java代码,并保留
    kafka:9092
    参考(这类似于KSQL和Control Center容器的工作方式)

  • 如果您只是使用Docker Compose,不知道为什么要显示Maven片段。您可以将监视拦截器添加到wurstmeister映像中,但是这需要更多的工作。只是为了显示逻辑正常工作的先前配置。也许这将有助于更好地理解合流堆栈的问题。现在我不知道可能有什么问题。
    “主题分区的x记录过期:自批创建以来已过XX毫秒”
    是经纪人或制作人的问题。您是否看到其中任何一个的日志表明存在问题?您一次发送多少条消息?Kafka Producer将批处理记录,因此您可能需要发送100条,或者至少设置一个while loop,我只是使用与Maven配置完全相同的场景-我只发送一条测试消息。有了Maven配置,一切都很好,有了Confluent stack,出现了上面提到的问题。这是Docker容器中的卡夫卡日志-非常感谢!!!现在一切都很顺利!
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092