【发布时间】: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