【问题标题】:C# error when connecting to docker instance of Kafka [duplicate]连接到 Kafka 的 docker 实例时出现 C# 错误 [重复]
【发布时间】:2021-12-08 00:33:24
【问题描述】:

我有一个使用 kafka-net (James Roland) 的 C# 项目。我有一个 docker compose 文件,它在我的笔记本电脑上运行 kafka。我可以毫无问题地从 Windows 命令行使用 kafka 实例生成和使用消息。

当我尝试从 C# 项目中向 kafka 中的主题生成消息时,我收到此错误

UnresolvedHostnameException: Could not resolve the following hostname: c60e8e54a7ca

System.AggregateException
  HResult=0x80131500
  Message=One or more errors occurred.
  Source=mscorlib
  StackTrace:
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at CSharpKafka.Form1.<>c__DisplayClass2_0.<button1_Click>b__0() in D:\Play\Kafka\CSharpKafka\Form1.cs:line 50
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

  This exception was originally thrown at this call stack:
    KafkaNet.DefaultKafkaConnectionFactory.GetFirstAddress(string, KafkaNet.IKafkaLog)
    KafkaNet.DefaultKafkaConnectionFactory.Resolve(System.Uri, KafkaNet.IKafkaLog)
    KafkaNet.BrokerRouter.UpdateInternalMetadataCache.AnonymousMethod__d(KafkaNet.Protocol.Broker)
    System.Linq.Enumerable.WhereSelectListIterator<TSource, TResult>.MoveNext()
    KafkaNet.BrokerRouter.UpdateInternalMetadataCache(KafkaNet.Protocol.MetadataResponse)
    KafkaNet.BrokerRouter.RefreshTopicMetadata(string[])
    KafkaNet.BrokerRouter.GetTopicMetadata(string[])
    KafkaNet.BrokerRouter.SelectBrokerRoute(string, byte[])
    KafkaNet.Producer.ProduceAndSendBatchAsync.AnonymousMethod__2a(KafkaNet.TopicMessage)
    System.Linq.Enumerable.WhereSelectEnumerableIterator<TSource, TResult>.MoveNext()
    ...
    [Call Stack Truncated]

Inner Exception 1:
AggregateException: One or more errors occurred.

Inner Exception 2:
UnresolvedHostnameException: Could not resolve the following hostname: c60e8e54a7ca

docker compose 是

version: '2'

networks:
  app-tier:
    driver: bridge

services:
  zookeeper:
    container_name: zookeeper-server
    image: 'bitnami/zookeeper:latest'
    environment:
        - ALLOW_ANONYMOUS_LOGIN=yes
    networks:
        - app-tier
  kafka:
    container_name: kafka-server
    image: 'bitnami/kafka:latest'
    environment:
        - ALLOW_PLAINTEXT_LISTENER=yes
        - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181
    networks:
        - app-tier
    ports:
      - "9092:9092"

C#代码是

            /*
             Adapted from https://www.c-sharpcorner.com/article/apache-kafka-net-application/
             */
            Uri uri =  new Uri("http://127.0.0.1:9092");

            string topic = "chat-messages";
            string payload = textBox1.Text;
            var sendMessage = new Thread(() => {
                
                KafkaNet.Protocol.Message 
                    msg = new KafkaNet.Protocol.Message(payload);

                var options = new KafkaOptions(uri);
                var router = new BrokerRouter(options);
                var client = new Producer(router);

                client.SendMessageAsync(topic, new List<KafkaNet.Protocol.Message> { msg }).Wait();
            });
            sendMessage.Start();

与错误消息相关的 docker ps 输出是

CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS                                                                      NAMES
c60e8e54a7ca   bitnami/kafka:latest       "/opt/bitnami/script…"   16 minutes ago   Up 16 minutes   0.0.0.0:9092->9092/tcp, :::9092->9092/tcp                                  kafka-server
6e97e28bd530   bitnami/zookeeper:latest   "/opt/bitnami/script…"   16 minutes ago   Up 16 minutes   2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp                                     zookeeper-server

我在 powershell 命令行中用来证明 kafka 实例正在运行的命令是

消费消息

docker exec -it kafka-server /opt/bitnami/kafka/bin/kafka-console-consumer.sh --topic chat-messages --from-beginning --bootstrap-server localhost:9092

生成消息

docker exec -it kafka-server /opt/bitnami/kafka/bin/kafka-console-producer.sh --topic chat-messages --bootstrap-server localhost:9092

寻求一些帮助来解决。 提前致谢

【问题讨论】:

  • 我猜你的 C# 代码没有在容器中运行,对吧?
  • 我还没有实际测试过,但我认为需要为 Kafka (KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9092) 设置一个新的 env-var。从内存中,这允许 Kafka 在与外部 docker(即来自主机)交谈时将自己宣传为“localhost”(而不是它的主机名)。请参阅Accessing Kafka with internal and external clients 部分,其中更详细地讨论了这一点 - 您可能还需要添加一些其他环境变量,例如KAFKA_CFG_LISTENERS
  • @DavidBrabant 是的,C# 代码当前没有在 docker 集中运行。一旦它起作用了。我会看看你的建议。谢谢。
  • 如果你这样做,在容器中运行你的 C# 代码,将 127.0.0.1 替换为“kafka”你的服务名称。
  • 看来我需要更多地探索环境变量的角度。你建议的第一个意味着我不再得到例外。我现在看到这个“没有连接到:127.0.0.1:9092。正在尝试连接......”。当尝试使用服务名称访问时,在发送语句执行之前,在路由等方面,我会遇到更多基本故障。所以我会牢记服务名称方面,但也会更多地关注环境变量。一旦我找到它,我将分享解决方案。谢谢@DavidBrabant

标签: c# docker apache-kafka docker-compose


【解决方案1】:

感谢@David Brabant 在环境变量和 docker 图像信息页面方面为我指明了正确的方向,我现在可以使用它了。

C# 代码有效。唯一的区别是我在 docker compose 文件中添加了以下环境变量。

        - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
        - KAFKA_BROKER_ID=1
        - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
        - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181

我还从原始 docker compose 文件中删除了一些我认为不需要的东西。

我的 docker compose 现在看起来像这样,我不需要更改任何其他内容。 更改在网页https://hub.docker.com/r/bitnami/kafka/ 中有详细说明,并向下滚动到“Kafka 开发设置示例”部分。

version: '2'

services:
  zookeeper:
    container_name: zookeeper-server
    image: 'bitnami/zookeeper:latest'
    environment:
        - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    container_name: kafka-server
    image: 'bitnami/kafka:latest'
    environment:
        - ALLOW_PLAINTEXT_LISTENER=yes
        - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181
        - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
        - KAFKA_BROKER_ID=1
        - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
        - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"

我不得不承认我不明白内部设置会以这种方式影响连接。

我在 C# 代码中的连接 URI 是

Uri uri =  new Uri("http://127.0.0.1:9092");

【讨论】:

  • Kafka 不是 HTTP 服务。去掉前缀
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 2021-08-30
  • 1970-01-01
  • 2018-04-17
  • 2019-09-30
  • 2020-10-11
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多