【问题标题】:Connection to external Kafka Server using confluent-kafka-dotnet fails使用 confluent-kafka-dotnet 连接到外部 Kafka 服务器失败
【发布时间】:2021-05-29 20:57:40
【问题描述】:

我需要使用 .Net 从外部服务器读取 Kafka 消息。作为第一步,我在本地机器上安装了 Kafka,然后编写了 .Net 代码。它按要求工作。然后,我搬到了云端,但代码不起作用。这是我的设置。

我在 Azure 上的 Windows VM(VM1:10.0.0.4)上部署了 Kafka 服务器。它已启动并正在运行。我创建了一个测试主题并使用 cmd 生成了一些消息。为了测试一切正常,我使用 cmd 打开了一个消费者并收到了生成的消息。

然后,我使用 Visual Studio 部署了另一个 Windows VM(VM2,10.0.0.5)。两个虚拟机都部署在同一个虚拟网络上,因此我不必担心打开端口或任何其他网络配置。

然后,我复制了我的 Visual Studio 项目代码,然后将引导服务器的 IP 地址更改为指向 Kafka 服务器。后来不行,我读到我必须更改Kafka的服务器配置,所以我打开了server.properties并将listeners属性修改为listeners=PLAINTEXT://10.0.0.4:9092。还是不行。

我在网上搜索并尝试了许多技巧,但都不起作用。我认为首先要向外部服务器(vm1)提供凭证,可能还有其他一些配置。不幸的是,官方documentation of confluent 非常简短,示例很少。在the official GitHub 上也没有我的例子。我玩过 Consumer Config 类中的“Sasl”属性,但也没有成功。

错误信息是:

%3|1622220986.498|失败|rdkafka#consumer-1| [thrd:10.0.0.4:9092/bootstrap]:10.0.0.4:9092/bootstrap:连接到 ipv4#10.0.0.4:9092 失败:未知错误(在 CONNECT 状态下 21038 毫秒后) 错误:10.0.0.4:9092/bootstrap:连接到 ipv4#10.0.0.4:9092 失败:未知错误(在 CONNECT 状态 21038 毫秒后) 错误:1/1 经纪人已关闭

这是我的 .Net 核心代码:

static void Main(string[] args)
    {
        string topic = "AzureTopic";
        var config = new ConsumerConfig
        {
            BootstrapServers = "10.0.0.4:9092",
            GroupId = "test",
            //SecurityProtocol = SecurityProtocol.SaslPlaintext,
            //SaslMechanism = SaslMechanism.Plain,
            //SaslUsername = "[User]",
            //SaslPassword = "[Password]",
            AutoOffsetReset = AutoOffsetReset.Latest,
            //EnableAutoCommit = false
        };

        int x = 0;
        
        using (var consumer = new ConsumerBuilder<Ignore, string>(config)
             .SetErrorHandler((_, e) => Console.WriteLine($"Error: {e.Reason}"))
            .Build())
        {
            consumer.Subscribe(topic);
            var cancelToken = new CancellationTokenSource();

            while (true)
            {
                // some tasks
            }
            consumer.Close();

【问题讨论】:

    标签: apache-kafka confluent-kafka-dotnet


    【解决方案1】:

    如果您将侦听器设置为硬编码 IP,它只会启动服务器绑定并接受到该 IP 的流量

    而且您的侦听器未定义为 SASL,因此我不确定您为什么尝试在客户端中使用它。虽然强烈建议在将数据发送到云资源时使用凭据,但不需要解决网络连接问题。但是,您绝对不应该通过明文发送凭据

    从这些设置开始

    listeners=PLAINTEXT://0.0.0.0:9092
    advertised.listeners=PLAINTEXT://10.0.0.4:9092
    

    仅此一项就应该在 VM 共享网络中工作。您可以使用 Kafka 附带的控制台工具对其进行测试。

    如果您的本地客户端仍然无法正常工作,那是因为10.0.0.0/8 地址空间被视为专用网络,您必须公布 VM 的公共 IP 并允许端口 9092 上的 TCP 流量通过 Azure 防火墙。为内部 Azure 网络和外部转发的网络流量公开多个侦听器也很有意义

    Details here 讨论 AWS 和 Docker,但基础知识仍然适用

    总的来说,我认为使用 Kafka 支持设置 Azure EventHub 会更容易

    【讨论】:

    • 感谢您的回答!我已经尝试过 ads.listeners 并再次尝试,它确实有效。我也尝试过公共并打开端口 9092,但效果不佳。没有防火墙设置。我必须设置一个并允许端口吗? EventHubs 是一个不错的选择,但它希望为预期目的工作。我们希望稍后将代码部署在容器上并保持独立于云提供商!
    • 所以它确实有效?如果没有,您是否阅读了链接的博客并查看了使用 kafkacat 的调试步骤?此外,您的基础架构设置代码已经是特定于云的;在您开始在部署中利用依赖于云身份验证服务的身份验证步骤之前,容器不会计算在内
    • 实际上,我没有在链接文章中使用多个侦听器执行该步骤,我打算接下来尝试,但我怀疑问题出在防火墙设置上 - 只是想确保第一的。我没有使用 Kafkacat,但检查了与 PowerShell 的连接(命令> Text-NetConnection [host] -p 9092)。 PowerShell 告诉我 Ping 成功,但端口 9092 上的 TCP-Connection 失败。所以我在想问题出在网络配置上。无论如何,我明天会运行 Kafkacat 调试器并告诉你:)。
    • 端口检查是一个很好的第一步,但不是全部。您正在检查的是listeners 已打开端口并且引导请求将得到答复。如果返回的advertised.listeners 地址能够连接到,则没有 powershell 工具可以回答,这就是kafkacat -L 数据显示的内容(然后您可以使用刚才提到的命令与集群中的各个代理连接)
    • 我们可能会迁移到 Confluent Cloud。所以希望我不必重复所有这些痛苦的配置。但是,我阅读了这篇文章,它非常有帮助,我明白我必须配置什么才能将数据从代理返回到我的客户端。无论如何,非常感谢 OneCricketeer 的帮助!
    猜你喜欢
    • 2021-11-14
    • 2021-01-05
    • 2021-12-20
    • 2022-08-16
    • 2017-08-30
    • 2022-12-16
    • 2022-11-21
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多